首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart/颤振Widget :获取使用kIsWeb的路径的测试覆盖率

Dart/颤振Widget :获取使用kIsWeb的路径的测试覆盖率
EN

Stack Overflow用户
提问于 2022-06-12 13:08:30
回答 1查看 187关注 0票数 0

我想测试并涵盖使用kIsWeb的小部件的两个路径。这门课看起来如下:

代码语言:javascript
复制
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    if (kIsWeb) {
      return Text("I'm web");
    } else {
      return Text("I'm not web");
    }
  }
}

搜索了一段时间之后,我在这里找到了一种测试方法:Testing kIsWeb constant in flutter

这是我写的测试类:

代码语言:javascript
复制
 class MockAppService extends Mock implements AppService {}
    
         void main() {
          final mockAppService = MockAppService();
          when(mockAppService.getkIsWeb())
              .thenAnswer((realInvocation) => true);
        
          testWidgets("add item", (WidgetTester tester) async {
            await tester.pumpWidget(MaterialApp(
              title: 'Flutter Demo',
              home: Scaffold(
                appBar: AppBar(
                  title: Text("title"),
                ),
                body: Center(
                  child: Text("message"),
                ),
              ),
            ));
            final PaymentPageState myWidgetState = tester.state(find.byType(PaymentPage));
            expect(find.byType(PaymentPage), findsOneWidget);
          });
        }

但我明白错误

类型'Null‘不是'bool’类型的子类型

我的AppService类和抽象类如下所示,

代码语言:javascript
复制
abstract class IAppService {
  bool getkIsWeb();
}

class AppService implements IAppService {
  bool getkIsWeb() {
    return kIsWeb;
  }
}

我是个新手,不知道很多事情。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2022-06-13 06:36:07

您找到的关于如何测试kIsWeb的解决方案应该有效,但您必须了解整个情况。

首先,这种方法的主要思想是,将决定应用程序是否在web上运行的责任移出小部件之外,而不是在小部件的构建方法中直接使用kIsWeb

因此引入了一个名为IAppService的接口,类AppService实现了这个接口。接口并不是真正需要的,我将在我的示例中直接使用AppService类。

您的小部件应该使用AppService实例并在其上调用getKIsWeb,而不是直接使用kIsWeb常量。有许多方法可以向小部件提供实例。使用构造函数参数是最简单的方法之一,但将来您可能想看看依赖注入或状态管理解决方案。

代码语言:javascript
复制
class MyWidget extends StatelessWidget {
  const MyWidget({Key? key, required this.appService}) : super(key: key);

  final AppService appService;

  @override
  Widget build(BuildContext context) {
    if (appService.getKIsWeb()) {
      return const Text('I\'m web');
    } else {
      return const Text('I\'m not web');
    }
  }
}

class AppService {
  bool getKIsWeb() {
    return kIsWeb;
  }
}

最后一点。当您测试您的小部件时,您会给它一个模拟的AppService类实现,它在调用getKIsWeb时返回true或false,这取决于您想要测试的内容。

代码语言:javascript
复制
class MockAppService extends Mock implements AppService {}

void main() {
  testWidgets('Test web widget', (WidgetTester tester) async {
    final mockAppService = MockAppService();
    when(() => mockAppService.getKIsWeb()).thenReturn(true);

    await tester.pumpWidget(
      MaterialApp(
        title: 'Flutter Demo',
        home: Scaffold(
          body: MyWidget(
            appService: mockAppService,
          ),
        ),
      ),
    );

    final webTextFinder = find.text('I\'m web');
    expect(webTextFinder, findsOneWidget);
  });

  testWidgets('Test not web widget', (WidgetTester tester) async {
    final mockAppService = MockAppService();
    when(() => mockAppService.getKIsWeb()).thenReturn(false);

    await tester.pumpWidget(
      MaterialApp(
        title: 'Flutter Demo',
        home: Scaffold(
          body: MyWidget(
            appService: mockAppService,
          ),
        ),
      ),
    );

    final webTextFinder = find.text('I\'m not web');
    expect(webTextFinder, findsOneWidget);
  });
}

请注意,我在这里使用的是Mocktail而不是Mockito。但你应该有个主意。

when(() => mockAppService.getKIsWeb()).thenReturn(false);是定义模拟行为的方式。https://pub.dev/packages/mocktail

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72592458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档