unit-testing - 如何在集成测试中模拟 BLoC

标签 unit-testing flutter mocking integration-testing bloc

我有一个使用 bloc 的 Flutter 应用程序和 flutter_bloc包裹。我正在尝试使用 flutter_driver 编写集成测试和 mockito .我如何模拟 BlocProvider和它的 child 总是发出一个单一的 mock 状态?

原来的 Bloc :

class SummaryBloc extends Bloc<BlocEvent, BlocState> {
  final SummaryRepository repository;

  SummaryBloc(this.repository);

  @override
  BlocState<Summary> get initialState => BlocStateEmpty<Summary>();

  @override
  Stream<BlocState> mapEventToState(
    BlocEvent event,
  ) async* {
    if (event is Fetch) yield BlocStateSuccess<Summary>(repository.getSummary());
  }
}

我试过模拟 bloc 并覆盖 state setter/getter :

class MockSummaryBloc extends Mock implements SummaryBloc {}

然后在检测应用中使用 mockito:

final MockSummaryBloc summaryBloc = MockSummaryBloc();

// whenever the state stream getter is called, return the mocked stream.
when(summaryBloc.state).thenAnswer((_) async* {
    yield BlocStateSuccess<Summary>(mockSummary);
  });

为了更好的衡量,我对 initialState 也做了同样的尝试.

要在检测应用程序中使用模拟,我使用 BlocProvider.value :

runApp(BlocProvider.value(
    value: summaryBloc,
    child: MaterialApp(
      title: 'Test Driver',
      home: Scaffold(
          body: BlocBuilder(
        bloc: summaryBloc,
        // the builder rebuilds on state change.
        builder: (context, state) {
          return Text('state: ${state?.runtimeType ?? 'isNull'}');
        },
      )),
    ),
  ));

我希望文本小部件打印 BlocStateSuccess<Summary>在运行时。但是,在驱动程序测试的生命周期内状态为空。

我是不是在错误地 mock 这个 Bloc ?是否有其他模拟 Bloc 的方法,或 Stream<BlocState>

最佳答案

您应该尝试模拟 SummaryRepository 而不是 Bloc。这将允许您测试 bloc 的行为并控制存储库返回流的内容。

class MockSummaryRepository extends Mock implements SummaryRepository{}

var mockRepository = MockSummaryRepository();
when(mockRepository.getSummary()).thenReturn(mockSummary);

final SummaryBloc summaryBloc = SummaryBloc(mockRepository);

关于unit-testing - 如何在集成测试中模拟 BLoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273168/

相关文章:

scala - 用类替换单例是否有任何潜在问题?

java - 具有复杂参数的单元测试

c++ - Gmock 只期待一个特定的调用

python - 如何测试(使用 unittest)Django View 的 HTML 输出?

c# - Visual Studio 2012 单元测试报告

firebase - Firestore更新子集合文档

unit-testing - 单元测试 - 困惑

dart - 我可以为 Flutter 单元测试或集成测试制作自定义匹配器吗?

android - Gradle 失败可能是因为这个 Flutter 应用程序中的 AndroidX 不兼容

testing - 最小起订量 - 是否可以在设置中指定验证标准(例如调用次数)?