簡體   English   中英

flutter測試如何模擬處理widget?

[英]How to simulate disposing widget in flutter test?

此方法將調用無狀態小部件內的 init function。 但是如何模擬處理 function 的調用呢?

    var widget = StatelessWidgetExample();
    await tester.pumpWidget(widget);

我還嘗試模擬從樹中移除。

    await tester.pumpWidget(widget);
    await tester.pumpWidget(Container());

但它沒有用

是不是這樣


    var key2 = Key('a');
    var testStateful = _TestStateful(
      key: key2,
      child: TestInitDispose(),
    );

    await tester.pumpWidget(testStateful);
    /// will call init

    var state = tester.firstState<__TestStatefulState>(find.byKey(key2));
    state.remove();

    await tester.pump();
    /// will call dispose
  });

...

class _TestStateful extends StatefulWidget {
  final Widget child;
  const _TestStateful({Key? key, required this.child}) : super(key: key);

  @override
  __TestStatefulState createState() => __TestStatefulState();
}

class __TestStatefulState extends State<_TestStateful> {
  bool showChild = true;
  void remove() {
    setState(() {
      showChild = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return showChild ? widget.child : Container();
  }
}

您可以使用 StreamBuilder 並將 YourWidget 替換為另一個小部件,然后調用 YourWidget 的 dispose 方法。

void main() {
  late StreamController<Widget> widgetStreamController;

  setUp(() async {
    widgetStreamController = StreamController<Widget>();
  });

  tearDown(() async {
    await widgetStreamController.close();
  });

  Widget buildApp() {
    return MaterialApp(
      home: StreamBuilder<Widget>(
        stream: widgetStreamController.stream,
        builder: (context, snapshot) {
          return snapshot.data ?? Container();
        },
      ),
    );
  }

  testWidgets('dispose widget', (tester) async {
    await tester.pumpWidget(buildApp());
    await tester.pumpAndSettle();

    widgetStreamController.add(YourWidget());
    await tester.pumpAndSettle();

    // todo: check here if YourWidget is displayed

    widgetStreamController.add(AnotherWidget());
    await tester.pumpAndSettle();

    // todo: check here if dispose was called 
  });
}

這對我有用,而且相對簡單。

var widget = StatelessWidgetExample();

await tester.pumpWidget(widget);
await tester.pumpAndSettle();
await tester.pumpWidget(Container());
await tester.pumpAndSettle();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM