Mock返回类型为Task的方法时result.Result始终为null的问题
问题解决:Moq Mock方法返回Result为null
问题原因
你用Moq设置SaveToSQL的返回值时,使用了具体的model实例作为匹配参数,但Moq默认采用引用相等性匹配——只有当调用方法时传入的实例和Setup时的实例是同一个对象时,才会返回预设的ResponseMessage。如果两者不是同一个实例,Mock会返回该类型的默认值(也就是null)。
解决方法
根据你的需求选择以下任意一种方案:
1. 匹配任意ConsumerModel实例
如果你不关心传入的具体实例,只想让Mock始终返回预设值,用It.IsAny<ConsumerModel>()替代具体的model:
_iIngestionRepository.Setup(m => m.SaveToSQL(It.IsAny<ConsumerModel>())) .ReturnsAsync(new ResponseMessage());
2. 匹配符合特定条件的实例
如果需要验证传入的实例属性符合预期,用It.Is<>指定匹配条件:
// 示例:匹配Id等于目标值的ConsumerModel _iIngestionRepository.Setup(m => m.SaveToSQL(It.Is<ConsumerModel>(x => x.Id == model.Id))) .ReturnsAsync(new ResponseMessage());
3. 确保使用同一个实例
如果必须严格匹配特定实例,确保Setup和调用时使用完全相同的对象(比如复用同一个变量),或者在ConsumerModel类中重写Equals和GetHashCode方法,让Moq能识别逻辑相等的实例。
额外建议
异步代码中尽量避免直接访问Task.Result,这会阻塞线程并可能导致死锁。推荐使用await获取结果:
ResponseMessage result = await _ingestionRepository.SaveToSQL(model);
内容的提问来源于stack exchange,提问作者HItesh Kumar
相关产品推荐
相关产品推荐

