使用 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 ^
],
);
);
【问题讨论】:
你能分享TopHeadlines
和Article
的课吗?
【参考方案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 测试特定状态的主要内容,如果未能解决你的问题,请参考以下文章