简体   繁体   English

Flutter 中提供者的单元测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM