我想测试并涵盖使用kIsWeb的小部件的两个路径。这门课看起来如下:
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
这是我写的测试类:
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类和抽象类如下所示,
abstract class IAppService {
bool getkIsWeb();
}
class AppService implements IAppService {
bool getkIsWeb() {
return kIsWeb;
}
}我是个新手,不知道很多事情。请帮帮忙。
发布于 2022-06-13 06:36:07
您找到的关于如何测试kIsWeb的解决方案应该有效,但您必须了解整个情况。
首先,这种方法的主要思想是,将决定应用程序是否在web上运行的责任移出小部件之外,而不是在小部件的构建方法中直接使用kIsWeb。
因此引入了一个名为IAppService的接口,类AppService实现了这个接口。接口并不是真正需要的,我将在我的示例中直接使用AppService类。
您的小部件应该使用AppService实例并在其上调用getKIsWeb,而不是直接使用kIsWeb常量。有许多方法可以向小部件提供实例。使用构造函数参数是最简单的方法之一,但将来您可能想看看依赖注入或状态管理解决方案。
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,这取决于您想要测试的内容。
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
https://stackoverflow.com/questions/72592458
复制相似问题