簡體   English   中英

使用 Flutter bloc_test 測試特定狀態

[英]Testing for specific states using Flutter bloc_test

我正在嘗試測試使用 BloC 模式和 bloc_test 發出的特定值。 目前,當我預期失敗時,我能夠通過測試。 bloc_test 必須只檢查發出的狀態類型而不是特定值。 有沒有辦法使用 bloc_test package 來測試我們發射狀態的特定值?

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

如果您樂於使用預發布版本: 8.0.0-nullsafety.0 ,您可以在 blocTest 中將預期的blocTest傳遞給expect ,或者您可以像在常規 Dart/Flutter 測試中一樣通過Matcher

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

如果發出的第一個 state 具有類型: TopHeadlines ,這將成功。 如果要驗證 state 除了其類型之外的一些屬性,還可以使用:

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

如果您不能在您的應用程序中使用預發布版本, Bloc擴展Stream ,因此您可以使用常規 stream 測試方法來驗證正確的行為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM