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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:37:11