错误迁移到更新的Flutter_Bloc&使用Mockito进行测试
我试图在一个过时的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
查看迁移指南 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 newon<Event>
format.