我正在尝试对我的 BLoC 中的方法进行单元测试,但遇到了一个奇怪的错误:
没有匹配的呼叫。所有调用: MockAlertBloc.add(AlertError(type 'Null' is not a subtype of type 'Future
', null)) (如果您拨打
,请改为使用verify(...).called(0);
。) 包:匹配器失败 包:mocktail/src/mocktail.dart 728:7 _VerifyCall._checkWith 包:mocktail/src/mocktail.dart 519:18 _makeVerify。 测试/blocs/job_bloc_test.dart main..verifyNever(...);
我调试了它并发现它是由 jobRepository.getJobs() 抛出的,这没有意义,因为我在测试中几乎嘲笑了该方法。
我在这里做错了什么吗?
我的BLoC方法:
void _onFetch(JobFetch event, Emitter<JobState> emit) async {
JobState oldState = state;
try {
emit(JobLoading());
List<Job> jobs = await jobRepository.getJobs();
emit(JobLoaded(jobs: jobs));
} catch (e, stacktrace) {
emit(oldState);
alertBloc.add(AlertError(error: e, stackTrace: stacktrace));
}
}
这是我的测试文件:
class MockJobRepository extends Mock implements JobRepository {}
class MockAlertBloc extends MockBloc<AlertEvent, AlertState>
implements AlertBloc {}
class MockAuthBloc extends MockBloc<AuthEvent, AuthState> implements AuthBloc {
@override
AuthState get state => AuthLoggedIn();
}
void main() {
group('JobBloc', () {
late JobRepository jobRepository;
late AuthBloc authBloc;
late AlertBloc alertBloc;
late JobBloc jobBloc;
setUp(() {
jobRepository = MockJobRepository();
authBloc = MockAuthBloc();
alertBloc = MockAlertBloc();
jobBloc = JobBloc(
jobRepository: jobRepository,
authBloc: authBloc,
alertBloc: alertBloc,
);
});
test('adds AlertError to AlertBloc when an error occurs during JobFetch',
() async {
final error = Exception('Error fetching jobs');
when(() => jobRepository.getJobs()).thenThrow(error);
final expectedStates = [
JobInitial(), // Old state
];
final expectedAlertError = AlertError(error: error, stackTrace: null);
expectLater(
jobBloc.stream,
emitsInOrder(expectedStates),
);
verify(() => alertBloc.add(expectedAlertError)).called(1);
jobBloc.add(const JobFetch());
});
});
}
如果有帮助,这是我的 JobRepository
class JobRepository {
final JobProvider jobProvider;
const JobRepository({required this.jobProvider});
Future<List<Job>> getJobs() async {
List<Job> allJobs = await jobProvider.getJobs(query: {"perPage": "200"});
allJobs.retainWhere((job) {
bool? isPublished = job.isPublished;
return isPublished != null &&
isPublished &&
});
return allJobs;
}
}
我尝试调试测试,尝试重写 MockJobRepository 中的 getJobs 方法,尝试通过测试,但没有帮助
我认为错误发生是因为发出的
AlertError
与 expectedAlertError
不同。如果您想检查错误的参数,请尝试 verify(alertBloc.add(isA<AlertError>())).called(1);
,您可以使用 captureAny
final captured = verify(alertBloc.add(captureAny)).captured;
expect(captured.first.error, error);