[英]Unit Testing for Providers in Flutter
We have started a new project on Flutter in the TDD approach.我们已经在 TDD 方法中启动了一个关于 Flutter 的新项目。 I am using providers for State Management.
我正在使用状态管理提供程序。 While trying to write the Widget Testing we are facing the issue to test the providers.
在尝试编写小部件测试时,我们面临着测试提供程序的问题。 Can you please suggest with an example to write the unit testing for providers and widget injects the provider.
你能否用一个例子来建议为提供者和小部件注入提供者的单元测试。
I'm getting the following issue我遇到以下问题
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════
The following ProviderNotFoundException was thrown running a test:
Error: Could not find the correct Provider above this SplashScreen Widget
To fix, please:
Ensure the Provider is an ancestor to this SplashScreen Widget
Provide types to Provider
Provide types to Consumer
Provide types to Provider.of()
Always use package imports. Ex: `import 'package:my_app/my_code.dart';
Ensure the correct context is being used.
══╡ Splash Screen Code╞════════════════════════════════════ ==╡ 启动画面代码╞==================================
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../routes.dart';
import '../../constants/constants.dart';
import '../../providers/provider.dart';
import '../../services/navigation_service.dart';
import '../../utils/utlis.dart';
class SplashScreen extends StatefulWidget {
@override
SplashScreenState createState() => SplashScreenState();
}
class SplashScreenState extends State {
void startTime() {
const _duration = Duration(seconds: Preferences.splashScreenTime);
Timer(_duration, _getInitialData);
_getInitialData();
}
dynamic _getInitialData() async {
final TokenProvider tokenProvider =
Provider.of(context, listen: false);
await tokenProvider.setAccessToken();
navigationPage();
}
void navigationPage() {
NavigationService.pushReplacementNamedTo(Routes.home_screen);
}
@override
void initState() {
super.initState();
startTime();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Stack(
key: const Key('splashScreen_body'),
fit: StackFit.expand,
children: [
Image.asset(
'assets/images/flutter.png',
key: const Key('splashScreen_image'),
)
],
),
);
}
}
thank in advance预先感谢
You need to wrap the widget you want to test in the providers used by that widget.您需要将要测试的小部件包装在该小部件使用的提供程序中。
As such, you may want to write:因此,您可能需要编写:
await tester.pumpWidget(
Provider<TokenProvider>(
child: SplashScreen(),
),
);
If you have repeated tests with such code, you can utilize extension
如果您对此类代码进行了重复测试,则可以使用
extension
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:mockito/mockito.dart';
Widget wrapWithMaterial() => MaterialApp(
home: Provider<TokenProvider>(
create: (_) => MockTokenProvider(),
child: Scaffold(
body: this,
),
),
);
class MockTokenProvider extends Mock implements TokenProvider {}
And now inside your test you could do现在在你的测试中你可以做
await tester.pumpWidget(
SplashScreen().wrapWithMaterial()
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.