在 Dart 中具有功能的 Mockito
Posted
技术标签:
【中文标题】在 Dart 中具有功能的 Mockito【英文标题】:Mockito with functions in Dart 【发布时间】:2018-05-22 16:45:52 【问题描述】:我有一个我想模拟的方法,但是当我尝试验证此方法的调用时。我收到一条错误消息:
Used on a non-mockito object
这里是简化的代码:
test('test',()
MockReducer reducer = new MockReducer();
verify(reducer).called(0);
);
class MockReducer extends Mock
call(state, action) => state;
为什么我不能这样做?
【问题讨论】:
【参考方案1】:我认为你这里有三个问题:
-
Mockito 仅适用于类,而不适用于函数(请参阅https://github.com/dart-lang/mockito/issues/62)。您有一些选择:创建函数的测试实现,或者对于
redux.dart
,您可以实现ReducerClass
(通过实现call
充当Reducer
函数)。
您需要验证被调用的方法,而不是整个 Mock 类。
您必须使用verifyNever
而不是verify(X).called(0)
。
工作示例:
class MockReducer extends Mock implements ReducerClass
main()
test('should be able to mock a reducer', ()
final reducer = new MockReducer();
verifyNever(reducer.call(any, any));
);
【讨论】:
根据您提供的链接,我只是创建了一个新函数,它完全可以在没有 Mockito 的情况下完成。这似乎是最干净的解决方案。谢谢! 你甚至可以删除.call
。【参考方案2】:
如果您只想创建一个模拟函数以在小部件测试环境中用作 onTap,则可以使用 mockito 执行以下操作:
abstract class MyFunction
void call();
class MyFunctionMock extends Mock implements MyFunction
测试:
void main()
final mock = MyFunctionMock();
...
// This is inside the the testWidgets callback
await tester.pumpWidget(
widgetToBeTested(
item: registeredListItem,
onTap: mock,
),
);
//Logic to tap the widgetToBeTested
verify(mock()).called(1);
【讨论】:
这行得通!我之前尝试在测试环境中使用模拟函数,这是模拟和测试通过构造函数传递给小部件的方法的最简单、最干净的方法。以上是关于在 Dart 中具有功能的 Mockito的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter / dart中使用具有设定大小的自定义字体?