飞镖单元测试流onData / onError

时间:2020-02-29 14:44:17

标签: flutter dart

测试流订阅时遇到了一些问题。

问题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订阅吗?

0 个答案:

没有答案
相关问题