Flutter中用Mocktail结合Either做单元测试报错求助
问题分析与修复
核心问题是测试断言的类型与实际返回类型不匹配:
SearchRepository.search返回Future<Either<FailureSearchException, List<ResultSearch>>>- 你的
SearchByTextImpl应该也返回相同的Either类型(除非你在useCase里做了额外错误处理) - 但测试里断言
result是List<ResultSearch>类型,导致类型不匹配报错。
修复步骤
1. 修正测试断言
如果 SearchByTextImpl 的返回类型是 Future<Either<FailureSearchException, List<ResultSearch>>>,修改测试断言如下:
test('should return Right with list of ResultSearch', () async { // 模拟仓库返回成功的Right结果 when(() => repository.search(any())).thenAnswer((_) async => const Right<List<ResultSearch>>([])); final result = await useCase("something"); // 断言结果是Right类型 expect(result, isA<Right<FailureSearchException, List<ResultSearch>>>()); // 进一步断言Right内部的列表为空 expect((result as Right).value, isEmpty); // 或者用fold更优雅地检查 result.fold( (failure) => fail('Expected Right, got Left'), (list) => expect(list, isEmpty), ); });
2. 确认 SearchByTextImpl 的实现
确保useCase的返回类型与仓库一致,示例实现应该类似:
class SearchByTextImpl { final SearchRepository repository; SearchByTextImpl(this.repository); Future<Either<FailureSearchException, List<ResultSearch>>> call(String? searchText) async { return await repository.search(searchText); } }
3. 可选:处理nullable参数的mock(如果需要)
如果mockito对String?参数的匹配有问题,可以明确指定类型:
when(() => repository.search(any<String?>())).thenAnswer((_) async => const Right<List<ResultSearch>>([]));
内容的提问来源于stack exchange,提问作者pllsatierf
相关产品推荐
相关产品推荐

