Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I stub a function that does not belong to a class, during a widget test?

I am creating a flutter app that uses the native camera to take a photo, using the official flutter camera package (https://pub.dev/packages/camera). The app opens up a modal that loads a CameraPreview based on the the result of the availableCameras function from the package and a FloatingActionButton which takes a photo when pressed. While creating a widget test for this modal, I can not figure out how to stub the availableCameras function to return what I want during tests.

I tried using the Mockito testing package, but this only supports mocking classes. Since this function does not belong to a class, I cannot mock it.

The availableCameras function returns a list of cameras that the device has. I want to be able to control what comes back from this function, so that I may test how my widget reacts to different cameras. What is the proper way to have this function return what I want during a widget test?

like image 437
Bakkingamu Avatar asked Aug 20 '19 23:08

Bakkingamu


2 Answers

Mockito can mock functions too. In dart, functions are classes with a call method.

You can, therefore, use Mockito as usual, with an abstract call method:

class MockFunction extends Mock {
  int call(String param);
}

This example represents a int Function(String param).

Which means you can then do:

final int Function(String) myFn = MockFunction();
when(myFn('hello world')).thenReturn(42);

expect(myFn('hello world'), equals(42));
like image 109
Rémi Rousselet Avatar answered Nov 02 '22 19:11

Rémi Rousselet


In this very specific situation, you can mock the method channel call handler.

const cameraMethodChannel = MethodChannel('plugins.flutter.io/camera');

setUpAll(() {
  cameraMethodChannel.setMockMethodCallHandler(cameraCallHandler);
});

tearDownAll(() {
  cameraMethodChannel.setMockMethodCallHandler(null);
});

Future<dynamic> cameraCallHandler(MethodCall methodCall) async {
  if (methodCall.method == 'availableCameras') return yourListOfCameras;
}
like image 27
Hugo Passos Avatar answered Nov 02 '22 21:11

Hugo Passos