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

Testing 在小部件测试期间,如何存根不属于类的函数?,testing,flutter,dart,flutter-test,Testing,Flutter,Dart,Flutter Test,我正在创建一个颤振应用程序,使用官方的颤振相机软件包()使用本机相机拍照。应用程序打开一个模式,根据软件包中的availableCameras功能的结果加载一个CameraPreview,并打开一个floatingAction按钮,按下该按钮时拍照。在为此模式创建小部件测试时,我不知道如何存根availableCameras函数以返回测试期间所需的内容 我尝试使用Mockito测试包,但它只支持模拟类。因为这个函数不属于类,所以我不能模拟它 availableCameras函数返回设备拥有的摄像

我正在创建一个颤振应用程序,使用官方的颤振相机软件包()使用本机相机拍照。应用程序打开一个模式,根据软件包中的
availableCameras
功能的结果加载一个
CameraPreview
,并打开一个
floatingAction按钮,按下该按钮时拍照。在为此模式创建小部件测试时,我不知道如何存根
availableCameras
函数以返回测试期间所需的内容

我尝试使用Mockito测试包,但它只支持模拟类。因为这个函数不属于类,所以我不能模拟它


availableCameras
函数返回设备拥有的摄像头列表。我希望能够控制这个函数返回的内容,以便测试我的小部件对不同摄像头的反应。在小部件测试期间,让这个函数返回我想要的内容的正确方法是什么?

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

因此,您可以像往常一样使用Mockito,使用抽象的
调用
方法:

类Mock函数扩展了Mock{
int调用(字符串参数);
}
此示例表示
int函数(字符串参数)

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

final int函数(字符串)myFn=MockFunction();
when(myFn('hello world'))。然后return(42);
expect(myFn('helloworld'),等于(42));

在这种非常特殊的情况下,您可以

constcamerethodchannel=MethodChannel('plugins.flatter.io/camera');
setUpAll((){
cameraMethodChannel.setMockMethodCallHandler(cameraCallHandler);
});
泪滴(){
cameraMethodChannel.setMockMethodCallHandler(null);
});
未来的cameraCallHandler(MethodCall MethodCall)异步{
如果(methodCall.method=='availableCameras')返回您的摄像机列表;
}

非常有趣,但这不是只有在函数被注入(例如作为参数)时才起作用吗?你能提供一个模拟顶级函数的例子吗?@HugoPassos是的,你需要一个方法来替换另一个函数。不过,有很多不同的方法可以做到这一点。例如,函数可以是一个可变的全局变量。有很多书专门讨论这些模式,所以我不能合理地给出一个明确的解决方案。是的,但我们谈论的是一个公共图书馆。在这种情况下,我无法以任何方式替换该函数。您不必直接使用该函数。一个全局
var getCameras=availableCameras
应该可以做到这一点。然后您的测试可以用不同的值替换它。