我有一个StatefulWidget(称为MyWidget),其State(MyWidgetState)具有一个myData在initState()以下期间初始化的字段:
void initState() {
super.initState();
myData = new myData(config.someField.getId());
}
Run Code Online (Sandbox Code Playgroud)
当用户按下按钮时,myData将添加到全局列表中或从全局列表中删除。
我正在尝试编写一个单元测试来测试此行为,但是我不知道如何访问MyWidgetState。我尝试将其包含在setup()中:
widget = MyWidget();
widgetState = widget.createState();
widgetState.init();
Run Code Online (Sandbox Code Playgroud)
但是它每次尝试进入initState()时都会崩溃,并抱怨“ someField在null上被调用”。没关系。我可能试图通过这种方式来作弊,我应该使用WidgetBuilder进行一些操作,或者使用MyWidget启动应用程序,然后在正确实例化树后在树中找到MyWidget。
如果做完所有这些,一旦完成,我如何访问该MyWidget的MyWidgetState以获取myData的副本并将其与全局列表进行比较?
小智 16
您可以创建一个状态,然后访问它的内容。继伊恩希克森回答。下面是一个实现的例子:
final MyWidgetState myWidgetState = tester.state(find.byType(MyWidget));
Run Code Online (Sandbox Code Playgroud)
然后就可以访问状态内容了:
myWidgetState.myData;
Run Code Online (Sandbox Code Playgroud)
您可以在 Flutter 的repo 中找到更多示例。
Gpa*_*ack 10
如果您想对小部件状态的方法之一编写单元测试,可以按以下方法完成:
// Assuming your stateful widget is like this:
class MyWidget extends StatefulWidget {
const MyWidget({this.someParam, Key? key}) : super(key: key);
final String someParam;
@override
MyWidgetState createState() => MyWidgetState();
}
@visibleForTesting
class MyWidgetState extends State<MyWidget> {
int methodToBeTested() {
// dummy implementation that uses widget.XXX
if (widget.someParam.isEmpty) return 0;
return 1;
}
@override
Widget build(BuildContext context) {
// return ...
}
}
// In your test file
void main() {
test('if widget.someParam is empty, do something', () {
const widget = MyWidget(someParam: '');
final element = widget.createElement(); // this will set state.widget
final state = element.state as MyWidgetState;
expect(state.methodToBeTested(), 0);
});
}
Run Code Online (Sandbox Code Playgroud)
使用创建小部件tester.pumpWidgets,然后使用tester.state(find.foo)查找State(在其中find.foo找到小部件的查找器)。请参阅WidgetTester文档以获取更多选项。
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |