在单元测试期间,如何访问StatefulWidget状态的内容?

Rea*_*nkm 4 flutter

我有一个StatefulWidget(称为MyWidget),其State(MyWidgetState)具有一个myDatainitState()以下期间初始化的字段:

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 中找到更多示例。

  • 应选择此作为正确答案。然而,你错过了一些东西。为了正确访问状态属性,当您获取状态时,您必须指定状态的类型: `tester.state<MyWidgetState>(find.byType(MyWidget));` 然后,您将能够访问其属性,而无需出现任何错误。 (5认同)

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)

  • 太感谢了!这应该是公认的答案 (3认同)

Ian*_*son 5

使用创建小部件tester.pumpWidgets,然后使用tester.state(find.foo)查找State(在其中find.foo找到小部件的查找器)。请参阅WidgetTester文档以获取更多选项。

  • 能给我举个例子吗。你的答案不是很清楚 (5认同)
  • 我确实同意@MrDumb,你的答案并不完全清楚。 (2认同)