测试流订阅时遇到了一些问题。
问题1。测试(“成功时应产生UserEntity”):
如果我删除注释为“ LINE IN QUESTION” await unsubscribe();
的行,则测试通过。添加该行时,期望_entity
失败,因为它为null。为什么会这样?以及我该如何解决?
第二季度。测试(“失败时应该抛出”):
如何测试ServerException
是引发的错误?
user_store.dart
typedef _Usecase<T> = T Function();
class UserStore {
final TrackUser _track;
UserEntity _entity;
StreamSubscription<T> _subscription;
UserStore({
UserEntity _entity,
@required TrackUser track,
}) : _entity = entity,
_track = track;
Future<void> track(String id) async {
await subscribe(() => _track(id));
}
Future<void> subscribe(_Usecase<Stream<T>> usecase) async {
await unsubscribe(); // <------ LINE IN QUESTION <-------
_subscription = usecase().listen(
(entity) {
_entity = entity;
},
onError: (failure) {
throw '${failure.error.head} ${failure.error.message}';
},
onDone: () async {
await unsubscribe();
},
);
}
Future<void> unsubscribe() async {
if (_subscription != null) {
await _subscription.cancel();
_subscription = null;
}
}
}
user_store_test.dart
class MockTrackUser extends Mock implements TrackUser {}
void main() {
MockTrackUser mockTrackUser;
UserStore store;
setUp(() {
mockTrackUser = MockTrackUser();
store = UserStore(
track: mockTrackUser,
);
});
const tUserId = 'user0';
group('track', () {
test(
'should yield UserEntity when successful',
() async {
// Arrange
when(mockTrackUser(any)).thenAnswer((_) => Stream.value(dUserEntity));
// Act
await store.track(tUserId);
// Assert
expect(store.entity, dUserEntity);
expect(store.subscription, isNotNull);
verify(mockTrackUser(tUserId));
},
);
test(
'should throw when unsuccessful',
() async {
// Arrange
when(mockTrackUser(any)).thenAnswer((_) => Stream.error(ServerException()));
// Act
await store.track(tUserId);
// Assert
expect(store.entity, null);
expect(store.subscription, isNotNull);
verify(mockTrackUser(tUserId));
},
);
});
}
更新 似乎在取消订阅并将其设置为null的地方触发了onDone。失败的期望是Expect(store.subscription,isNotNull)。我不应该取消onDone订阅吗?