如何Mock返回值需被使用的Firebase Functions HttpCallableResult(Flutter)
解决Firebase可调用函数Mock报错的方案
你的报错核心原因是:链式调用when(functions.httpsCallable("generateMatch").call())时,会重新执行一次httpsCallable方法,而这次调用没有对应的Stub,Mockito自动生成了一个Fake对象,当你调用它的call方法时就触发了错误。
修正后的Mock代码
final functions = MockFirebaseFunctions(); // 1. 先创建并Stub好HttpsCallable实例的call方法 final mockCallable = MockHttpsCallable(); final mockResult = MockHttpsCallableResult(); when(mockResult.data).thenReturn({"statusCode": 200}); when(mockCallable.call()).thenAnswer((_) async => mockResult); // 2. 让FirebaseFunctions的httpsCallable返回这个已经配置好的实例 when(functions.httpsCallable("generateMatch")).thenReturn(mockCallable);
模拟调用错误的场景
如果需要模拟函数调用失败(比如抛出HttpsCallableException),可以修改call方法的Stub:
when(mockCallable.call()).thenThrow(HttpsCallableException( code: "invalid-request", message: "参数错误", details: {"field": "userId", "error": "不能为空"}, ));
为什么原来的写法不行
Mockito的when方法处理链式调用时,functions.httpsCallable("generateMatch")会被实际执行一次,而不是复用你之前写的第一个Stub。所以必须先单独配置好HttpsCallable实例的行为,再让FirebaseFunctions返回这个预配置的实例,才能避免Fake对象被意外调用的错误。
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

