Flutter Mockito验证调用了传递给小部件的回调

时间:2019-09-22 03:24:46

标签: testing flutter dart

我有一个小部件,它带有一个回调,当按下按钮时会调用该回调。我正在尝试测试按钮是否正确调用了回调。

我尝试嘲笑Function类:

class MockCallback extends Mock implements Function {
  call() {}
}

然后将模拟类的实例传递给我的小部件并模拟水龙头:

final mocked = MockCallback();
await tester.pumpWidget(
  MyWidget(myCallback: mocked),
);

final clearButtonFinder = find.byType(IconButton);
await tester.tap(clearButtonFinder);

verify(mocked()).called(1);

这会导致verify调用出现错误,提示Used on a non-mockito object。如果我在模拟的call中放入打印语句,则可以看到水龙头确实在调用它。

如何验证点击按钮时传递给我的小部件的回调是否被调用一次?

2 个答案:

答案 0 :(得分:2)

我就是这样解决这个问题的。

class MockCallback {
  int _callCounter = 0;
  void call() {
    _callCounter += 1;
  }

  bool called(int expected) => _callCounter == expected;
  void reset() {
    _callCounter = 0;
  }
}

不需要mockito。

答案 1 :(得分:0)

可能不是最佳解决方案-使用流:

final callbackCalled = BehaviorSubject<void>.seeded(null);

await tester.pumpWidget(
  MyWidget(myCallback: () { callbackCalled.add(null); }),
);

//... actions to trigger the callback

await expectLater(callbackCalled, emitsInOrder(<void>[null, null]));

您可以使用有意义的内容代替“ void”和“ null”。