在小部件测试期间,如何存根不属于类的函数?

时间:2019-08-20 23:12:23

标签: testing flutter dart flutter-test

我正在创建一个抖动应用程序,它使用官方的抖动照相机包(https://pub.dev/packages/camera)使用本机相机拍摄照片。该应用程序将打开一个模态,该模态将根据来自包装的CameraPreview函数的结果加载一个availableCameras和一个FloatingActionButton,当按下时会拍照。在为此模式创建窗口小部件测试时,我无法弄清楚如何对availableCameras函数进行存根以返回测试期间想要的内容。

我尝试使用Mockito测试包,但这仅支持模拟类。由于此函数不属于类,因此无法对其进行模拟。

availableCameras函数返回设备所拥有的摄像机列表。我希望能够控制此功能返回的结果,以便测试我的小部件对不同相机的反应。使此函数在小部件测试期间返回我想要的东西的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

Mockito也可以模拟函数。在dart中,函数是带有call方法的类。

因此,您可以照常使用Mockito和抽象的call方法:

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

此示例表示一个int Function(String param)

这意味着您可以执行以下操作:

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

expect(myFn('hello world'), equals(42));

答案 1 :(得分:0)

在这种非常特殊的情况下,您可以mock the method channel call handler

setUpAll(() {
  const MethodChannel('plugins.flutter.io/camera')
      .setMockMethodCallHandler(cameraCallHandler);
});

Future<dynamic> cameraCallHandler(MethodCall methodCall) async {
  if (methodCall.method == 'availableCameras') return yourListOfCameras;
}