如何测试Flutter Bloc测试中的异常
我正在尝试使用Flutter中的Bloc_test框架编写BLOC测试。在任何人尝试将其删除之前,没有与测试小部件/单位测试进行扑来的例外情况。集体测试不同。
我有一个我正在测试的肘。它具有称为getPrinterforms()的方法。我正在尝试测试被捕获的异常,以确保它发出正确的状态。谁能查看我的测试的代码以及该方法的代码,让我知道我是否做错了什么?
@GenerateMocks([PrinterRepositoryImpl])
void main() {
late MockPrinterRepositoryImpl mockPrinterRepository;
late PrinterCubit printerCubit;
setUp(() {
mockPrinterRepository = MockPrinterRepositoryImpl();
printerCubit = PrinterCubit(mockPrinterRepository);
});
tearDown(() {
printerCubit.close();
});
group('PrinterCubit Tests', () {
blocTest(
'getPrinterForms emits [PrinterLoading, PrinterError] when unsuccessful',
build: () {
when(mockPrinterRepository.fetchPrinterForms(http.Client())).thenThrow(NetworkException());
return printerCubit;
},
act: (PrinterCubit cubit) => cubit.getPrinterForms(),
expect: () => [
PrinterLoading(),
const PrinterError("Couldn't fetch printer forms. Is the device online?")
],
);
});
}
class NetworkException implements Exception{}
Future<void> getPrinterForms() async {
try {
emit(PrinterLoading());
final printerForms = await _printerRepository.fetchPrinterForms(http.Client());
emit(PrinterLoaded(printerForms));
} on NetworkException {
emit(const PrinterError("Couldn't fetch printer forms. Is the device online?"));
}
}
@override
abstract class PrinterState extends Equatable {
const PrinterState();
@override
List<Object> get props => [];
}
class PrinterInitial extends PrinterState {}
class PrinterLoading extends PrinterState {}
class PrinterLoaded extends PrinterState {
final List<PrinterModel> printerForms;
const PrinterLoaded(this.printerForms);
}
class PrinterDetails extends PrinterState {
final PrinterModel printerForm;
const PrinterDetails(this.printerForm);
}
class PrinterError extends PrinterState {
final String message;
const PrinterError(this.message);
}
I'm trying to write BLoC tests using the bloc_test framework in Flutter. Before anyone tries taking this down, no this isn't the same as testing for exceptions in a widget/unit test for Flutter. BLoC tests are different.
I have a cubit that I'm testing. It has a method called getPrinterForms(). I'm trying to test the exception being caught, to make sure it emits the correct states. Can anyone look at the code for my test, and the code for the method, and let me know if there's anything I'm doing wrong?
@GenerateMocks([PrinterRepositoryImpl])
void main() {
late MockPrinterRepositoryImpl mockPrinterRepository;
late PrinterCubit printerCubit;
setUp(() {
mockPrinterRepository = MockPrinterRepositoryImpl();
printerCubit = PrinterCubit(mockPrinterRepository);
});
tearDown(() {
printerCubit.close();
});
group('PrinterCubit Tests', () {
blocTest(
'getPrinterForms emits [PrinterLoading, PrinterError] when unsuccessful',
build: () {
when(mockPrinterRepository.fetchPrinterForms(http.Client())).thenThrow(NetworkException());
return printerCubit;
},
act: (PrinterCubit cubit) => cubit.getPrinterForms(),
expect: () => [
PrinterLoading(),
const PrinterError("Couldn't fetch printer forms. Is the device online?")
],
);
});
}
class NetworkException implements Exception{}
Future<void> getPrinterForms() async {
try {
emit(PrinterLoading());
final printerForms = await _printerRepository.fetchPrinterForms(http.Client());
emit(PrinterLoaded(printerForms));
} on NetworkException {
emit(const PrinterError("Couldn't fetch printer forms. Is the device online?"));
}
}
@override
abstract class PrinterState extends Equatable {
const PrinterState();
@override
List<Object> get props => [];
}
class PrinterInitial extends PrinterState {}
class PrinterLoading extends PrinterState {}
class PrinterLoaded extends PrinterState {
final List<PrinterModel> printerForms;
const PrinterLoaded(this.printerForms);
}
class PrinterDetails extends PrinterState {
final PrinterModel printerForm;
const PrinterDetails(this.printerForm);
}
class PrinterError extends PrinterState {
final String message;
const PrinterError(this.message);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我尝试了一下,无法重现失败的测试。
小熊看起来像这样:
I gave it a try and I cannot reproduce a failed test.
The cubit looks like this: