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