在 Dart 中具有函数的 Mockito

Mar*_*łek 5 testing mockito dart flutter flutter-test

我有一个我想模拟的方法,但是当我尝试验证此方法的调用时。我收到一条错误消息:

Used on a non-mockito object
Run Code Online (Sandbox Code Playgroud)

这是简化的代码:

test('test',() {
  MockReducer reducer = new MockReducer();
  verify(reducer).called(0);
});

class MockReducer extends Mock {
  call(state, action) => state;
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能做这样的事情?

bri*_*gan 8

我认为你在这里有三个问题:

  1. Mockito 仅适用于类,不适用于函数(请参阅https://github.com/dart-lang/mockito/issues/62)。您有一些选择:创建函数的测试实现,或者对于redux.dart,您可以实现ReducerClassReducer通过实现充当函数call)。
  2. 您需要验证被调用的方法,而不是整个 Mock 类。
  3. 您必须使用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));
  });
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您只想创建一个模拟函数以用作小部件测试环境上的 onTap,则可以使用mockito 执行类似的操作:

abstract class MyFunction {
  void call();
}

class MyFunctionMock extends Mock implements MyFunction {}
Run Code Online (Sandbox Code Playgroud)

测试:

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);

}
Run Code Online (Sandbox Code Playgroud)