我希望为Flutter中的屏幕挂件编写Mockito测试。问题是,该挂件使用了导航参数中的一个变量,我不确定如何模拟这个变量。
以下是示例屏幕:
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()
。 - Mamo1234