Flutter Mockito 验证传递给 widget 的回调被调用

Kev*_*Shi 7 testing dart flutter

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

我尝试过嘲笑一个Function班级:

class MockCallback extends Mock implements Function {
  call() {}
}
Run Code Online (Sandbox Code Playgroud)

然后将模拟类的实例传递给我的小部件并模拟点击:

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

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

verify(mocked()).called(1);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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]));
Run Code Online (Sandbox Code Playgroud)

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