Flutter中针对提供商的单元测试

时间:2020-01-14 13:47:46

标签: flutter flutter-dependencies flutter-test flutter-plugin flutter-channel

我们已经以TDD方法启动了关于Flutter的新项目。我正在使用提供程序进行状态管理。 在尝试编写Widget测试时,我们面临着测试提供程序的问题。 您能举个例子来建议编写提供者的单元测试,并为提供者进行小部件注入吗?

我遇到了以下问题

══╡ 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.

══╡启动画面代码╞════════════════════════════════════

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'),
)
],
),
);
}
}

先谢谢

2 个答案:

答案 0 :(得分:4)

您需要将要测试的小部件包装在该小部件使用的提供程序中。

这样,您可能要写:

await tester.pumpWidget(
  Provider<TokenProvider>(
    child: SplashScreen(),
  ),
);

答案 1 :(得分:2)

如果您已使用此类代码重复测试。 您可以利用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 MockTokenProviderextends Mock implements TokenProvider{}

现在在测试中,您可以

await tester.pumpWidget(
  SplashScreen().wrapWithMaterial()
);
相关问题