0

我正在尝试在我的应用程序中测试剪贴板功能。当我按下按钮时,它应该将我的文本复制到剪贴板。当我尝试使用小部件测试来测试此功能时,返回的未来没有得到解决。有没有办法模拟 Clipboard.setData 方法?

由于我的原始代码非常大,我做了一个可重现的小部件测试,它有同样的问题。当我执行期望()时,布尔数据复制为假。

testWidgets('test clipboard function', (WidgetTester tester) async {
    var dataCopied = false;
    await tester.pumpWidget(
      MaterialApp(
        home: Container(
          width: 10,
          height: 10,
          child: ElevatedButton(
            onPressed: (() {
              Clipboard.setData(ClipboardData(text: "test")).then((_) {
                dataCopied = true;
              });
            }),
            child: Text("Copy Text"),
          ),
        ),
      ),
    );

    await tester.tap(find.byType(ElevatedButton));
    expect(dataCopied, true);
  });
4

1 回答 1

0

我找到了解决方案。我检查了颤振源代码,似乎剪贴板类使用 SystemChannels.platform 来调用本机剪贴板函数。在另一篇文章中,我看到可以模拟 Channels如何模拟/存根 Flutter 平台通道/插件?

testWidgets('test clipboard function', (WidgetTester tester) async {
    var dataCopied = false;
    
    final List<MethodCall> log = <MethodCall>[];
    SystemChannels.platform.setMockMethodCallHandler((MethodCall methodCall) async {
      log.add(methodCall);
    });

    await tester.pumpWidget(
      MaterialApp(
        home: Container(
          width: 10,
          height: 10,
          child: ElevatedButton(
            onPressed: (() {
              Clipboard.setData(ClipboardData(text: "test")).then((_) {
                dataCopied = true;
              });
            }),
            child: Text("Copy Text"),
          ),
        ),
      ),
    );

    await tester.tap(find.byType(ElevatedButton));
    expect(dataCopied, true);
  });
于 2021-07-25T14:07:10.743 回答