【发布时间】:2019-11-22 03:11:55
【问题描述】:
我想为 Flutter 中的屏幕小部件编写一个模拟测试。问题是,这个小部件使用来自导航参数的变量,我不知道如何模拟这个变量。
这是示例屏幕:
class TestScreen extends StatefulWidget {
static final routeName = Strings.contact;
@override
_TestScreenState createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> {
Contact _contact;
@override
Widget build(BuildContext context) {
_contact = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: AppBar(title: Text(Strings.contact)),
body: Text(_contact.name),
);
}
}
用这个命令打开屏幕
Navigator.pushNamed(context, TestScreen.routeName, arguments: contact);
通常我会模拟一些组件,但我不确定如何模拟屏幕参数。我希望它能像这样工作。但是,我不知道我能准确地模拟什么。
when(screenArgument.fetchData(any))
.thenAnswer((_) async => expectedContact);
这是当前的测试,因为 _contact 为空,所以它当然不起作用:
void main() {
testWidgets('contact fields should be filled with data from argument', (WidgetTester tester) async {
// GIVEN
final testScreen = TestApp(widget: TestScreen());
// WHEN
await tester.pumpWidget(testScreen);
// THEN
expect(find.text("test"), findsOneWidget);
});
}
一种丑陋的方法是使用屏幕的构造函数参数仅用于测试,但我想避免这种情况。
也许你们当中有人知道如何最好地测试此类屏幕小部件。
【问题讨论】:
-
我的解决方案不是使用导航参数,而是将参数传递给构造函数。您还必须使用带有自定义路由的
push()而不是pushNamed() -
我同意 Lukas 的观点,最好通过构造函数传递参数。但我们实际上可以组合它,我们仍然可以使用导航参数但通过类构造函数接收它(不是从上下文中),你可以在这里查看这个视频教程youtube.com/watch?v=nyvwx7o277U
标签: flutter mocking mockito flutter-test