mocktail icon indicating copy to clipboard operation
mocktail copied to clipboard

[Question] How to mock VoidCallback parameters

Open metalbass opened this issue 1 year ago • 0 comments

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.

metalbass avatar Sep 07 '22 08:09 metalbass