Flutter Mockito 验证回调函数是否被调用

7

我有一个小部件,它使用回调函数来响应按钮按下事件。我正在尝试测试回调是否被正确地调用。

我尝试模拟了一个Function类:

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

然后将模拟类的实例传递给我的widget并模拟一个点击:

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 内部加入打印语句,我能够看到点击确实触发了它。

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


1
这是对我有效的解决方案: https://dev59.com/66fja4cB1Zd3GeqPul_g#67060954 - Diana
2个回答

3

这就是我解决这个问题的方式。

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

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

无需使用mockito。


希望有人能提供一个如何在测试中使用它的示例。 - Diana

1

也许这不是最好的解决方案 - 使用流:

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'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接