【问题标题】:How to test BLoC listening stream?如何测试 BLoC 监听流?
【发布时间】:2021-06-27 04:38:58
【问题描述】:

我想测试我的 chat_bloc 文件,它监听了几个流:

class ChatBloc extends Bloc<ChatEvent, ChatState> {
  final ChatRepository chatRepository;

  ChatBloc(
      {@required this.chatRepository,})
      : super(ChatLoading()) {

    this.add(ChatScreenStarted());

    _chatSubscription = chatRepository.message.listen((message) { // error points here
      // do smth
    });
  }

  StreamSubscription<Message> _chatSubscription;
  //  mapEventToState and others

  }

ChatRepository 中的消息获取器:

@override
  Stream<Message> get message async* {
    yield* chatDataSource.messages;
  }

用 mockito 模拟 ChatRepository。并尝试像这样进行测试:

class MockChatRepository extends Mock implements ChatRepository {}

void main() {
  MockChatsRepository mockChatsRepository;

  ChatBloc chatBloc;

  setUp(() {
    mockChatRepository = MockChatRepository();
    
    chatBloc = ChatBloc(
      chatRepository: mockChatRepository,
    );
  });

  blocTest(
    'sould ...',
    build: () => chatBloc,
    act: (ChatBloc chatBloc) {
      when(mockChatRepository.message)
          .thenReturn(Stream<Message>.fromIterable([tMessageModel]));
      chatBloc.add(ChatScreenStarted());
    },
    expect: () => [],
  );
}

给出错误NoSuchMethodError:方法'listen'在null上被调用。

如何存根该流?

【问题讨论】:

    标签: flutter dart testing bloc


    【解决方案1】:

    我应该在实例化 bloc 之前这样做:

        when(mockChatRepository.message).thenAnswer((_) {
          return Stream.fromIterable([tMessage]);
        });
    

    这将创建 bloc 已经在监听的流。

    附:谢谢 Aleksander "TAZ" Krinzhovnik

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2021-02-17
      • 1970-01-01
      • 2023-03-29
      • 2021-02-20
      • 2022-01-11
      • 2019-10-24
      • 2022-08-19
      • 2019-12-31
      相关资源
      最近更新 更多