如何解决在mapEventToState中使用yield和Either时,测试我的bloc失败
我正在学习有关干净架构的课程,并且遇到以下错误。
以下测试失败。
test('should emit [Error] when the input is invalid',() async {
final tNumberString = '1';
when(mockInputConverter.stringToUnsignedInteger(any))
.thenReturn(Left(InvalidInputFailure()));
final expected = [
Empty(),Error(message: invalidInput),];
expectLater(bloc.state,emitsInOrder(expected));
bloc.add(GetTriviaForConcreteNumberEvent(tNumberString));
});
我的NumberTriviaBloc如下
part 'number_trivia_event.dart';
part 'number_trivia_state.dart';
const String serverFailureMessage = 'Server Failure';
const String cacheFailureMessage = 'Cache Failure';
const String invalidInput =
'Invalid input - the number should be a positive integer';
class NumberTriviaBloc extends Bloc<NumberTriviaEvent,NumberTriviaState> {
NumberTriviaBloc(
{@required GetConcreteNumberTrivia concrete,@required GetRandomNumberTrivia random,@required this.inputConverter})
: assert(concrete != null),assert(random != null),assert(inputConverter != null),_getConcreteNumberTrivia = concrete,_getRandomNumberTrivia = random,super(Empty());
final GetConcreteNumberTrivia _getConcreteNumberTrivia;
final GetRandomNumberTrivia _getRandomNumberTrivia;
final InputConverter inputConverter;
@override
Stream<NumberTriviaState> mapEventToState(
NumberTriviaEvent event,) async* {
if (event is GetTriviaForConcreteNumberEvent) {
final inputEither =
inputConverter.stringToUnsignedInteger(event.numberString);
yield* inputEither.fold(
(l) async* {
yield Error(message: invalidInput);
},(r) => throw UnimplementedError(),);
}
}
}
我不太熟悉集团模式以及流和状态的测试机制。我猜测由于失败消息如下,导致代码无法正确执行
ERROR: Expected: should do the following in order:
emit an event that Empty:<Empty>
emit an event that Error:<Error>
Actual: Empty:<Empty>
Which: was not a Stream or a StreamQueue
解决方法
所以我自己解决了。问题中的代码对旧版本的dart有效。目前
import org.apache.livy._
import org.apache.spark.sql.SparkSession
class Test extends Job[Int]{
override def call(jc: JobContext): Int = {
val spark = jc.sparkSession()
val logFile = "file:///root/spark/README.md"
val logData = spark.read.textFile(logFile).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println(s"Lines with a: $numAs,Lines with b: $numBs")
1 //Return value
}
}
将破坏代码。代替
bloc.state
应该用来获取状态。
第二个问题是不再有
bloc
修改内容反映在下面的代码中。
number_trivia_bloc_test.dart
throw UnimplementedError();
number_trivia_bloc.dart
test('should emit [Error] when the input is invalid',() async {
when(mockInputConverter.stringToUnsignedInteger(any))
.thenReturn(Left(InvalidInputFailure()));
bloc.add(GetTriviaForConcreteNumberEvent(tNumberString));
final expected = [
Error(message: invalidInput),];
expectLater(bloc,emitsInOrder(expected));
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。