You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:22:42