当对 throw 进行单元测试时,“Null”类型不是“Future<List<Job>>”类型的子类型

问题描述 投票:0回答:1

我正在尝试对我的 BLoC 中的方法进行单元测试,但遇到了一个奇怪的错误:

没有匹配的呼叫。所有调用: MockAlertBloc.add(AlertError(type 'Null' is not a subtype of type 'Future', null)) (如果您拨打

verify(...).called(0);
,请改为使用
verifyNever(...);
。) 包:匹配器失败 包:mocktail/src/mocktail.dart 728:7 _VerifyCall._checkWith 包:mocktail/src/mocktail.dart 519:18 _makeVerify。 测试/blocs/job_bloc_test.dart main..

我调试了它并发现它是由 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 方法,尝试通过测试,但没有帮助

flutter dart unit-testing testing bloc
1个回答
0
投票

我认为错误发生是因为发出的

AlertError
expectedAlertError
不同。如果您想检查错误的参数,请尝试
verify(alertBloc.add(isA<AlertError>())).called(1);
,您可以使用
captureAny

final captured = verify(alertBloc.add(captureAny)).captured;
expect(captured.first.error, error);
© www.soinside.com 2019 - 2024. All rights reserved.