在 Dart 中具有功能的 Mockito
Mockito with functions in Dart
我想模拟一个方法,但是当我尝试验证对该方法的调用时。我收到一条错误消息:
Used on a non-mockito object
这是简化的代码:
test('test',() {
MockReducer reducer = new MockReducer();
verify(reducer).called(0);
});
class MockReducer extends Mock {
call(state, action) => state;
}
为什么我不能做这样的事情?
我认为你在这里遇到了三个问题:
- Mockito 仅适用于 类,不适用于函数(参见 https://github.com/dart-lang/mockito/issues/62)。您有一些选择:创建函数的测试实现,或者对于
redux.dart
,您可以实现 ReducerClass
(通过实现 call
作为 Reducer
函数)。
- 您需要验证正在调用的 方法 ,而不是整个 Mock class。
- 您必须使用
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));
});
}
如果您只想创建一个模拟函数以在小部件测试环境中用作 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);
}
我想模拟一个方法,但是当我尝试验证对该方法的调用时。我收到一条错误消息:
Used on a non-mockito object
这是简化的代码:
test('test',() {
MockReducer reducer = new MockReducer();
verify(reducer).called(0);
});
class MockReducer extends Mock {
call(state, action) => state;
}
为什么我不能做这样的事情?
我认为你在这里遇到了三个问题:
- Mockito 仅适用于 类,不适用于函数(参见 https://github.com/dart-lang/mockito/issues/62)。您有一些选择:创建函数的测试实现,或者对于
redux.dart
,您可以实现ReducerClass
(通过实现call
作为Reducer
函数)。 - 您需要验证正在调用的 方法 ,而不是整个 Mock class。
- 您必须使用
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));
});
}
如果您只想创建一个模拟函数以在小部件测试环境中用作 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);
}