我在Dart类中有一个方法,它接受BuildContext
参数,如下所示:
class MyClass {
<return_type> myMethodName(BuildContext context, ...) {
...
doSomething
return something;
}
}
我想测试该方法是否按预期工作:
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
...
void main() {
MyClass sut;
setUp(() {
sut = MyClass();
});
test('me testing', () {
var actual = sut.myMethodName(...);
expect(actual, something);
});
}
当然,它不会工作,因为方法myMethodName
需要一个参数BuildContext
类型。这个值在整个应用程序中都是可用的,但不确定在我的单元测试中从哪里获取它。
4条答案
按热度按时间fxnxkyjh1#
一种方法是将
testWidgets
与Builder
widget结合使用:cotxawn72#
下面是一种在测试用例中检索BuildContext示例的简单方法:
这是受
showDialog()
函数的Flutter测试用例Simple dialog control test的启发。整个“应用程序”由
MaterialApp
框架中的Container
小部件组成。通过查找与Container
相关的Element
示例来检索BuildContext
示例。slhcrj9b3#
实际上,您可以模拟
BuildContext
,这样测试就可以无头运行。我认为这是更好的,但可能不是你正在寻找的解决方案。BuildContext
是一个抽象类,因此不能示例化。任何抽象类都可以通过创建该类的实现来模拟。如果我以你的例子为例,那么代码看起来像这样:(Note这需要Mockito包:https://pub.dev/packages/mockito.)
l7wslrjt4#
我完全可以用“surga”的答案,但在某些情况下,它还不够好。例如,当你想使用这个
BuildContext
和InhiretedWidget
时:Provider
或MediaQuery
。因此,我建议使用
Mockito
默认生成器为您生成BuildContext
类。将
build_runner
添加到pubspec.yaml
然后运行以下命令:
flutter packages pub run build_runner build
现在,您可以从
MockBuildContext
类创建context
对象,因为它通常是从MaterialApp
创建的。**注意:**此Mock不需要添加
when..thenReturn
,具体取决于您的需求。