Flutter:测试小部件

时间:2018-09-21 13:48:47

标签: testing dart flutter

我要测试的是: 用户点击一个按钮,小吃栏显示五秒钟。

这是脚手架及其钥匙:

final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(debugLabel: "scaffoldState");

...

builder: (context, viewModel) => Scaffold(
              key: _scaffoldKey,

然后是按钮和快餐栏的代码:

child: FlatButton(key: Key('loginButton'), onPressed: () { 
 validate();

...

  validate() {
    // FormState object can be used to save, reset, and validate
    // every FormField that is a descendant of the associated Form.

    final FormState form = _formKey.currentState;

    if (form.validate()) {
      form.save();
      form.reset();

      //implementation of the snackBar:
      _scaffoldKey.currentState.showSnackBar(new SnackBar(
        duration: new Duration(seconds: 5)

...

我正在尝试以这种方式测试这种行为(我也在使用Flutter redux):

void main(){

  final store = Store<AppState>(reducer, initialState: AppState.initialState());
  testWidgets("MaterialApp local", (WidgetTester tester) async{
    await tester.pumpWidget(new StoreProvider(
        store: store,
        child: MaterialApp(
          home: LoginView(),
        )));
    await tester.pumpAndSettle();
    await tester.press(find.byKey(Key("loginButton")));
    expect();

我不知道该放些什么。我试图使用find.ByKey(Key))获取GlobalKey并搜索debugLabel,但是它似乎不起作用。我从两天后开始尝试,但是找不到出路。

2 个答案:

答案 0 :(得分:1)

回答这个问题可能为时已晚,但是由于这是Google在输入“ Flutter test Snackbar”时的第二个结果,因此我只给我两分钱:

实际上非常简单。不要将Snackbar视为完全不同的东西,仅仅是因为它只在底部停留了几秒钟。最后,Snackbar只是另一个小部件。

记住这一点,您可以按以下步骤进行测试:

testWidgets("MaterialApp local", (WidgetTester tester) async{
  ...
  // Test if the Snackbar appears
  expect(find.byType(SnackBar), findsOneWidget);
  // Test if it contains your text
  expect(find.text('TAPS!'), findsOneWidget);
});

答案 1 :(得分:0)

我实际上满足了与您相同的条件,而我所做的只是将文本作为小吃栏的内容。

用于显示小吃店,我使用的代码是

scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("TAPS!"),));
          }, "SEE ALL", backgroundColor: Colors.red, textColor: Colors.blue)

,我希望找到内容与输入内容相同的文本,并添加findsOneWidget。

expect(find.text("TAPS!"), findsOneWidget);