我想对一个广播流回购进行单元测试.该回购首先生成StateOk,然后在调用onEvent()时生成StateError:
class Repo {
final _controller = StreamController<State>.broadcast();
Stream<State> get changes async* {
yield StateOk();
yield* _controller.stream;
}
Future<void> onEvent() async {
_controller.add(StateError());
}
}
abstract class State extends Equatable {
@override
List<Object?> get props => [];
}
class StateOk extends State {}
class StateError extends State {}
当我try 像这样运行单元测试时:
void main() {
test('testError', () async {
final Repo repo = Repo();
expectLater(
repo.changes,
emitsInOrder([
StateOk(),
StateError(),
]));
//await Future.delayed(const Duration(milliseconds: 1));
repo.onEvent();
});
}
测试无限期地运行.
如果我在调用onEvent之前添加Future.delayed()
,测试将成功完成.所以,我首先假设这是一个时间问题,我们丢失了最初的StateOk流元素,这就是为什么expectLater
没有完成.
但是,如果我删除emitsInOrder()中的StateError(),它就可以工作,而无需额外的等待时间.这告诉我,我们没有错过最初的状态. 怎么回事?