我正在学习 Flutter Clean Architecture TDD 类(class)近 20 天。我正在编写 Stream (mapEventToState) 的单元测试,这是我的测试代码:
test(
'should emit [Error] when the input is invalid',
() async {
// arrange
when(mockInputConverter!.stringToUnsignedInteger(SIGNED_STRINGS))
.thenReturn(Left(InvalidInputFailure()));
// assert later
final expected = [
// The initial state is always emitted first
NumberTriviaEmpty(),
NumberTriviaError(message: INVALID_INPUT_FAILURE_MESSAGE),
];
expectLater(bloc!.state, emitsInOrder(expected));
// act
bloc!.add(GetTriviaForConcreteNumber(tNumberString));
},
);
忘记所有关于(何时),因为我已经模拟了所有类并简单地返回一个 Left of Either 这很好,这显然是一个失败。因此,预期数据的问题出现了,我刚刚创建了预期列表并将其传递给方法“expectLater”,以“emitsInOrder”的顺序传递。
我的 Stream 实现代码在这里:
@override
Stream<NumberTriviaState> mapEventToState(NumberTriviaEvent event,) async* {
if (event is GetTriviaForConcreteNumber) {
final inputEither =
inputConverter.stringToUnsignedInteger(event.numberString);
yield* inputEither!.fold(
(failure) async* {
yield NumberTriviaError(message: INVALID_INPUT_FAILURE_MESSAGE);
},
// Although the "success case" doesn't interest us with the current test,
// we still have to handle it somehow.
(integer) => throw UnimplementedError(),
);
}
我在标题中输入的[错误]没有完成,因为它有点长我在这里分享它请看看它实际上我做错了什么。
Expected: should do the following in order:
• emit an event that NumberTriviaEmpty:<NumberTriviaEmpty()>
• emit an event that NumberTriviaError:<NumberTriviaError(Invalid Input - The number must be a positive integer or zero.)>
Actual: NumberTriviaEmpty:<NumberTriviaEmpty()>
Which: was not a Stream or a StreamQueue
我所做的一切都是一样的,它对我的期望是什么,但它仍然抛出这个异常。我在这个错误中停留了大约 4 天,我到处搜索,但没有找到任何解决方法,如果我做错了什么,请在评论部分或答案中提出您的建议。谢谢你:)
最佳答案
除了将 'bloc!.state' 更改为 'bloc'(根据 QuangNV 和 ouflak),还尝试将测试中的 'async' 更改为 asynchronous generator , 'async*', 以匹配您的 Stream 实现中使用的代码。
test(
'should emit [Error] when the input is invalid',
() async* {
// arrange
关于Flutter - 预期 : should do the following in order: emits an event Empty, NumberTriviaError,实际:空:不是 Stream 或 SteamQue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68990111/