使用资产提供者测试Flutter Bloc模式小部件

时间:2019-01-17 13:07:07

标签: dart flutter

我关注这篇文章:https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1,我需要可以从资产中解析某些文件的配置提供程序。我的提供者做的正确,启动应用程序后可以看到结果。但是我该如何测试呢?

我尝试该测试:

void main() {
  testWidgets('ConfigurationProvider can parse asset configuration file',
      (WidgetTester tester) async {
    final AutomatedTestWidgetsFlutterBinding binding = tester.binding;
    binding.addTime(Duration(seconds: 3));

    await tester.pumpWidget(
      MaterialApp(
        home: DefaultAssetBundle(
          bundle: TestAssetBundle(),
          child: MockWidget(),
        ),
      ),
    );

    await Future.delayed(Duration(seconds: 1));

    final conf = configurationProvider.config;
    expect(conf, isNotNull);
  });
}

class MockWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    configurationBloc.fetchConfig();
    return Scaffold(
      body: StreamBuilder(
        stream: configurationBloc.config,
        builder: (context, AsyncSnapshot<ConfigurationModel> snapshot) {
          if (snapshot.hasData) {
            return builder(snapshot);
          } else if (snapshot.hasError) {
            return Text(snapshot.error.toString());
          }
          return Center(child: CircularProgressIndicator());
        },
      ),
    );
  }

  Widget builder(AsyncSnapshot<ConfigurationModel> snapshot) {
    return Text(snapshot.data.apiVersion);
  }
}

// https://docs.flutter.io/flutter/widgets/DefaultAssetBundle-class.html
class TestAssetBundle extends CachingAssetBundle {
  @override
  Future<ByteData> load(String key) async {
    if (key == 'lib/src/assets/configuration.yaml')
      return ByteData.view(
          Uint8List.fromList(utf8.encode(configurationYAML)).buffer);
    return null;
  }

  static const configurationYAML = '''
  apiVersion: "v1.0"
    ''';
}

提供程序的fetchConfig()调用方法,该方法会更新预期的配置属性。

测试开始后出现错误:

TimeoutException after 0:00:05.500000: The test exceeded the timeout.

0 个答案:

没有答案