使用 Flutter bloc_test 测试特定状态

Posted

技术标签:

【中文标题】使用 Flutter bloc_test 测试特定状态【英文标题】:Testing for specific states using Flutter bloc_test 【发布时间】:2021-05-30 14:09:34 【问题描述】:

我正在尝试使用 BloC 模式和 bloc_test 测试发出的特定值。目前,当我预期失败时,我能够通过测试。 bloc_test 必须只检查发出的状态类型而不是特定值。有没有办法使用 bloc_test 包来测试我们发出的状态的特定值?

group('[NewsArticleBloc]', () 
    NewsArticleBloc sut;
    MockNewsRepo mockNewsRepo;
    setUp(() 
      mockNewsRepo = new MockNewsRepo();
      sut = NewsArticleBloc(newsRepo: mockNewsRepo);
    );

    tearDown(() => sut.close());

    blocTest(
      'Next state check',
      build: () => sut,
      act: (bloc) 
        when(mockNewsRepo.getTopHeadlines())
            .thenAnswer((_) => Future.value([Article(author: 'Josh')]));
        bloc.add(GetTopHeadlines());
      ,
      expect: [
        TopHeadlines(topHeadlines: [Article(author: 'Micheal')])
                                             //Expecting failure here ^
      ], 
    );
  );
 

【问题讨论】:

你能分享TopHeadlinesArticle的课吗? 【参考方案1】:

如果您乐于使用预发布版本:8.0.0-nullsafety.0,您可以在 blocTest 中将预期状态传递给 expect,或者您可以像在常规 Dart/Flutter 测试中一样传递 Matcher

// note expect now requires a function that produces a list
expect: () => [
  TypeMatcher<TopHeadlines>(),
]

如果发出的第一个状态具有类型:TopHeadlines,这将成功。如果要验证状态除了类型之外的一些属性,还可以使用:

expect: () => [
  TypeMatcher<TopHeadlines>()
    .having((headlines) => headlines.topHeadlines, 'topHeadlines', hasLength(1)) 
    .having((headlines) => headlines.otherProperty, 'otherProperty', isNotNull)
]

如果您无法在您的应用中使用预发布版本,Bloc 将扩展 Stream,因此您可以使用常规流测试方法来验证正确的行为:

final bloc = ...
final firstStateEmitted = bloc.skip(1).first;  // skip initialState then return the next state
expect(firstStateEmitted, isA<TopHeadlines>());
expect(firstStateEmitted.someProperty, isNotNull);

【讨论】:

以上是关于使用 Flutter bloc_test 测试特定状态的主要内容,如果未能解决你的问题,请参考以下文章

颤振测试块错误类型'Null'不是类型的子类型

如何正确测试颤振块

测试 Flutter 中是不是抛出了特定的异常

Flutter IOS 构建应用程序用于在特定设备上进行测试 XCode 9.2

Flutter驱动程序如何等待特定元素具有特定文本

Flutter 驱动:如何只运行一组或测试