Val*_*nal 7 mocking mockito dart flutter flutter-test
我想在我的 flutter 应用程序上编写一些集成测试。为此,我使用Mockito包。
我想模拟一个类,但也保留其原始实现。
假设我有一个模型MyModel
(可能很复杂)和一个使用它的小部件。
class MyModel {
void complexCallback() {}
}
class MyWidget extends StatelessWidget {
const MyWidget(this.model);
final MyModel model;
@override
Widget build(BuildContext context) {}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在测试中模拟MyModel
以验证回调函数是否被调用(例如,点击按钮后),但我也希望MyModel
表现得像它应该的那样,以验证屏幕上的影响(重建例如具有不同值的小部件)。
testWidget('Test MyModel and MyWidget', (WidgetTester tester) async {
final model = MyModel(); // <- Cannot verify here because it is not mocked, if I replace by MockMyModel or FakeMyModel, the button doesn't do anything anymore
await tester.pumpWidget(MyWidget(model));
await tester.tap(find.byType(IconButton)); // <- Tap on a button for example
expect(find.text('Button tapped'), findsOneWidget); // <- Test change on the screen - works with MyModel but not with MockMyModel and FakeMyModel
expect(verify(model.complexCallback(captureAny)).captured, ['buttonID']); // <- Test callback function - works with MockMyModel or FakeMyModel but not with MyModel
});
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果我按原样运行测试,MyModel
则不会被嘲笑,因此verify
无法工作。
如果我使用Mock
或Fake
来自Mockito来模拟它:
class MockMyModel extends Mock implements MyModel {}
Run Code Online (Sandbox Code Playgroud)
或者
class FakeMyModel extends Fake implements MyModel {}
Run Code Online (Sandbox Code Playgroud)
我将失去执行MyModel
,然后,点击后屏幕不会改变。而且我真的不想重写所有MyModel
可能相当大和复杂的方法。另外,如果我重写它,我将测试我重写的实现,而不是原始的实现,这并不是真正的重点。
知道我怎样才能实现它吗?
归档时间: |
|
查看次数: |
1134 次 |
最近记录: |