【问题标题】:Mockito with functions in Dart在 Dart 中具有功能的 Mockito
【发布时间】: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;
}

为什么我不能这样做?

【问题讨论】:

    标签: testing dart mockito flutter flutter-test


    【解决方案1】:

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

    1. Mockito 仅适用于类,而不适用于函数(请参阅https://github.com/dart-lang/mockito/issues/62)。您有一些选择:创建函数的测试实现,或者对于redux.dart,您可以实现ReducerClass(通过实现call 充当Reducer 函数)。
    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));
      });
    }
    

    【讨论】:

    • 根据您提供的链接,我只是创建了一个新函数,它完全可以在没有 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);
    
    }
    

    【讨论】:

    • 这行得通!我之前尝试在测试环境中使用模拟函数,这是模拟和测试通过构造函数传递给小部件的方法的最简单、最干净的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2022-11-12
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多