Flutter TDD项目测试报Bad state错误,求正确运行测试方案
解决Flutter TDD测试中的
Bad state: No method stub was called from within when()错误 错误信息
Bad state: No method stub was called from within
when(). Was a real method called, or perhaps an extension method?
问题代码
Repository代码
abstract class HomeRepository { Future<Either<Failure,BaseModel>> testCase({required ApiRequest apiRequest}); }
UseCase代码
class TestCase { HomeRepository homeRepository; TestCase({required this.homeRepository}); Future<Either<Failure,BaseModel>>call({required ApiRequest apiRequest})async{ return await homeRepository.testCase(apiRequest: apiRequest); } }
测试代码(原错误版本)
class HomeTest extends Mock implements HomeRepository{ @override Future<Either<Failure,BaseModel>> testCase({required ApiRequest apiRequest})async{ return await Right(AppModel.otpVerify); } } void main(){ ApiRequest apiRequest = ApiRequest(method: ApiMethod.post, endPoint: '/'); late HomeTest homeTest; late TestCase testCase; setUp(() { homeTest = HomeTest(); testCase = TestCase(homeRepository: homeTest); }); test('testcase', () async { // Setup when(homeTest.testCase(apiRequest: apiRequest)).thenAnswer((_) async => right(AppModel.otpVerify)); // Action final result = await testCase(apiRequest: apiRequest); // Verification expect(result, right(AppModel.otpVerify)); }); }
错误原因
你在自定义的HomeTest Mock类中手动重写了testCase方法,导致调用when(homeTest.testCase(...))时,实际执行的是你重写的真实方法,而非Mock库提供的用于生成stub的代理方法。Mock库需要接管方法调用逻辑才能记录stub,手动重写会破坏这一机制。
解决方案
去掉HomeTest类中对testCase方法的重写,让Mock类自动处理方法的stub逻辑:
// 仅保留Mock继承和接口实现,移除手动重写的方法 class HomeTest extends Mock implements HomeRepository{} void main(){ ApiRequest apiRequest = ApiRequest(method: ApiMethod.post, endPoint: '/'); late HomeTest homeTest; late TestCase testCase; setUp(() { homeTest = HomeTest(); testCase = TestCase(homeRepository: homeTest); }); test('testcase', () async { // Setup when(homeTest.testCase(apiRequest: apiRequest)).thenAnswer((_) async => right(AppModel.otpVerify)); // Action final result = await testCase(apiRequest: apiRequest); // Verification expect(result, right(AppModel.otpVerify)); }); }
补充说明
如果ApiRequest未正确实现==和hashCode方法,可能会导致stub匹配失败。可以通过两种方式解决:
- 为
ApiRequest类重写==和hashCode方法 - 在
when中使用匹配器替代具体实例:when(homeTest.testCase(apiRequest: any(named: 'apiRequest'))) .thenAnswer((_) async => right(AppModel.otpVerify));
内容的提问来源于stack exchange,提问作者Anas Sa
相关产品推荐
相关产品推荐

