在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中枚举或映射具有索引和值的列表

如何在flutter / dart中使用具有设定大小的自定义字体?

Dart 语言核心概念

在 Dart 中合并两个对象列表

在嵌入式 WebView 中设置 Dart 和 js 之间通信的通道

使用具有列表类型参数的 dart 类,如何使其具有等价性