mocktail
mocktail copied to clipboard
[Question] How to mock VoidCallback parameters
I'm testing a class that receives a VoidCallback in its constructor, which is going to be called after submitting a text field.
class MyViewModel with ChangeNotifier {
VoidCallback? onEditingComplete;
MyViewModel({this.onEditingComplete});
}
void main() {
testWidgets(
'onEditingComplete is called after submitting',
(tester) async {
final onEditingComplete = MockVoidCallback();
await tester.pumpWidget(
createWidgetAndViewModel(onEditingComplete: onEditingComplete),
);
await tester.showKeyboard(find.byKey(textFieldKey));
await tester.testTextInput.receiveAction(TextInputAction.done);
verify(() => onEditingComplete.call()).called(1);
},
);
}
For which I had to declare:
abstract class VoidCallbackClass {
void call();
}
class MockVoidCallback extends Mock implements VoidCallbackClass {}
and adapt during construction:
Widget createWidgetAndViewModel({MockVoidCallback? onEditingComplete}) {
final vm = MyViewModel(onEditingComplete: () => onEditingComplete?.call());
[...]
}
Is there a better way with less boilerplate? I have the feeling that there must be an easier way I'm overlooking.