错误迁移到更新的Flutter_Bloc&使用Mockito进行测试

发布于 2025-02-04 19:24:49 字数 4964 浏览 4 评论 0原文

我试图在一个过时的flutter通讯应用程序的教程之后与Mockito一起进行测试。我正在尝试使用所有内容的最新版本。该教程刚刚实现了Flutter Bloc,现在我遇到了一个我不知道如何修复的错误。

这是测试:

import 'package:chat/chat.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:rethink_chat/states_management/message/message_bloc.dart';

import 'message_bloc_test.mocks.dart';

@GenerateMocks([IMessageService])
void main() {
  late MessageBloc sut;
  late MockIMessageService messageService; //changed to Mock
  late User user;

  setUp(() {
    messageService = MockIMessageService(); // FakeMessageService();
    user = User(
      username: 'test',
      photoUrl: '',
      active: true,
      lastseen: DateTime.now(),
    );
    sut = MessageBloc(messageService);
  });

  tearDown(() => sut.close());

  test('should emit message sent state when message is sent', () {
    final message = Message(
      from: '123',
      to: '456',
      contents: 'test message',
      timestamp: DateTime.now(),
    );

    when(messageService.send(message)).thenAnswer((_) async => true);
    when(messageService.dispose()).thenAnswer((_) async => <Object?>[]);
    sut.add(MessageEvent.onMessageSent(message));
    expectLater(sut.stream, emits(MessageState.sent(message)));
  });
}

这是错误:

Bad state: add(MessageSent) was called without a registered event handler.
Make sure to register a handler via on<MessageSent>((event, emit) {...})

这是message_event.dart:

part of 'message_bloc.dart';

abstract class MessageEvent extends Equatable {
  const MessageEvent();
  factory MessageEvent.onSubscribed(User user) => Subscribed(user);
  factory MessageEvent.onMessageSent(Message message) => MessageSent(message);

  @override
  List<Object> get props => [];
}

class Subscribed extends MessageEvent {
  final User user;
  const Subscribed(this.user);

  @override
  List<Object> get props => [user];
}

class MessageSent extends MessageEvent {
  final Message message;
  const MessageSent(this.message);

  @override
  List<Object> get props => [message];
}

class _MessageReceived extends MessageEvent {
  const _MessageReceived(this.message);

  final Message message;

  @override
  List<Object> get props => [message];
}

and Message_bloc.dart:

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:chat/chat.dart';
import 'package:equatable/equatable.dart';
//import 'package:rethink_chat/states_management/message/message_event.dart';
// import 'package:rethink_chat/states_management/message/message_state.dart';
//import 'package:chat/chat.dart';

part 'message_event.dart';
part 'message_state.dart';

class MessageBloc extends Bloc<MessageEvent, MessageState> {
  final IMessageService _messageService;
  StreamSubscription?
      _subscription; // added a ? but not sure if it's neutral, helpful or harmful

  MessageBloc(this._messageService) : super(MessageState.initial());

  @override
  Stream<MessageState> mapEventToState(MessageEvent event) async* {
    if (event is Subscribed) {
      await _subscription?.cancel();
      _subscription = _messageService
          .messages(activeUser: event.user)
          .listen((message) => add(_MessageReceived(message)));
    }

    if (event is _MessageReceived) {
      yield MessageState.received(event.message);
    }
    if (event is MessageSent) {
      await _messageService.send(event.message);
      yield MessageState.sent(event.message);
    }
  }

  @override
  Future<void> close() {
    _subscription?.cancel();
    _messageService.dispose();
    return super.close();
  }
}

我在另一个帖子中看到了在某个时刻删除mapeventTostate的一篇文章中,但我不知道如何如何解决这个问题?我对此非常陌生,以至于根据查看其他代码的示例,知道该特定代码要解决的问题很难。

请让我知道是否有其他信息会有所帮助,我将更新此帖子以包含它。我是一个总体初学者,因此希望这是我忽略的非常简单的修复程序。我非常感谢任何帮助。

编辑:对于类似的测试,我也会遇到类似的错误:

  test('should emit messages received from service', () {
    final message = Message(
      from: '123',
      to: '456',
      contents: 'test message',
      timestamp: DateTime.now(),
    );

    when(messageService.messages(activeUser: anyNamed('activeUser')))
        .thenAnswer((_) => Stream.fromIterable([message]));
    when(messageService.dispose()).thenAnswer((_) async => <Object?>[]);

    sut.add(MessageEvent.onSubscribed(user));
    expectLater(sut.stream, emitsInOrder([MessageReceivedSuccess(message)]));
  });

错误是

Bad state: add(Subscribed) was called without a registered event handler.
Make sure to register a handler via on<Subscribed>((event, emit) {...})

我认为这两个修复程序都应该相同,对吗?

EDIT2:因此,我认为我需要将放在&lt; messagesent&gt;(((event,emit){...}){...}) and on&lt; lt; code> on&lt;((event,emit){。 ..})代码中的某个地方,但是在哪里?

I'm trying to run a test with mockito following an outdated tutorial for a messaging app in flutter. I'm trying to use the most updated versions of everything. The tutorial just implemented flutter bloc, and now I'm getting an error that I don't know how to fix.

This is the test:

import 'package:chat/chat.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:rethink_chat/states_management/message/message_bloc.dart';

import 'message_bloc_test.mocks.dart';

@GenerateMocks([IMessageService])
void main() {
  late MessageBloc sut;
  late MockIMessageService messageService; //changed to Mock
  late User user;

  setUp(() {
    messageService = MockIMessageService(); // FakeMessageService();
    user = User(
      username: 'test',
      photoUrl: '',
      active: true,
      lastseen: DateTime.now(),
    );
    sut = MessageBloc(messageService);
  });

  tearDown(() => sut.close());

  test('should emit message sent state when message is sent', () {
    final message = Message(
      from: '123',
      to: '456',
      contents: 'test message',
      timestamp: DateTime.now(),
    );

    when(messageService.send(message)).thenAnswer((_) async => true);
    when(messageService.dispose()).thenAnswer((_) async => <Object?>[]);
    sut.add(MessageEvent.onMessageSent(message));
    expectLater(sut.stream, emits(MessageState.sent(message)));
  });
}

This is the error:

Bad state: add(MessageSent) was called without a registered event handler.
Make sure to register a handler via on<MessageSent>((event, emit) {...})

This is message_event.dart:

part of 'message_bloc.dart';

abstract class MessageEvent extends Equatable {
  const MessageEvent();
  factory MessageEvent.onSubscribed(User user) => Subscribed(user);
  factory MessageEvent.onMessageSent(Message message) => MessageSent(message);

  @override
  List<Object> get props => [];
}

class Subscribed extends MessageEvent {
  final User user;
  const Subscribed(this.user);

  @override
  List<Object> get props => [user];
}

class MessageSent extends MessageEvent {
  final Message message;
  const MessageSent(this.message);

  @override
  List<Object> get props => [message];
}

class _MessageReceived extends MessageEvent {
  const _MessageReceived(this.message);

  final Message message;

  @override
  List<Object> get props => [message];
}

And message_bloc.dart:

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:chat/chat.dart';
import 'package:equatable/equatable.dart';
//import 'package:rethink_chat/states_management/message/message_event.dart';
// import 'package:rethink_chat/states_management/message/message_state.dart';
//import 'package:chat/chat.dart';

part 'message_event.dart';
part 'message_state.dart';

class MessageBloc extends Bloc<MessageEvent, MessageState> {
  final IMessageService _messageService;
  StreamSubscription?
      _subscription; // added a ? but not sure if it's neutral, helpful or harmful

  MessageBloc(this._messageService) : super(MessageState.initial());

  @override
  Stream<MessageState> mapEventToState(MessageEvent event) async* {
    if (event is Subscribed) {
      await _subscription?.cancel();
      _subscription = _messageService
          .messages(activeUser: event.user)
          .listen((message) => add(_MessageReceived(message)));
    }

    if (event is _MessageReceived) {
      yield MessageState.received(event.message);
    }
    if (event is MessageSent) {
      await _messageService.send(event.message);
      yield MessageState.sent(event.message);
    }
  }

  @override
  Future<void> close() {
    _subscription?.cancel();
    _messageService.dispose();
    return super.close();
  }
}

I saw in another post that flutter bloc at some point removed mapEventToState, but I don't know how to fix this for my situation? I'm so new to this that I have trouble knowing what to fix for this particular code, based on seeing examples of other code.

Please let me know if any other information would be helpful and I'll update this post to include it. I'm a total beginner, so this is hopefully a very simple fix that I'm overlooking. I greatly appreciate any help.

Edit: I also get a similar error for a similar test:

  test('should emit messages received from service', () {
    final message = Message(
      from: '123',
      to: '456',
      contents: 'test message',
      timestamp: DateTime.now(),
    );

    when(messageService.messages(activeUser: anyNamed('activeUser')))
        .thenAnswer((_) => Stream.fromIterable([message]));
    when(messageService.dispose()).thenAnswer((_) async => <Object?>[]);

    sut.add(MessageEvent.onSubscribed(user));
    expectLater(sut.stream, emitsInOrder([MessageReceivedSuccess(message)]));
  });

The error is

Bad state: add(Subscribed) was called without a registered event handler.
Make sure to register a handler via on<Subscribed>((event, emit) {...})

I assume the fix should be the same for both, right?

Edit2: so I'm thinking I need to put on<MessageSent>((event, emit) {...}) and on<Subscribed>((event, emit) {...}) somewhere in the code, but where?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

喜爱纠缠 2025-02-11 19:24:49

查看迁移指南 https://bloclibrary.dev/#/migration

仍然版本7.1或更低。您首先需要跟随7.1到7.2的迁移。这将向您展示如何将mapeventTostate迁移到新的on Event&gt;格式。

Check out the migration guide https://bloclibrary.dev/#/migration

It looks like your code is still version 7.1 or lower. You first need to follow the migration from 7.1 to 7.2. This will show you how to migrate your mapEventToState to the new on<Event> format.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文