如何Mock并设置GetCache方法?编译错误修复求助
问题解决方法
编译错误原因
你的测试代码存在两个核心问题:
- 泛型参数缺失:实际业务代码调用的是泛型方法
GetCache<IDictionary<Guid, DataExportRequestModel>>,但测试Setup时没有指定对应的泛型类型参数,Moq无法匹配正确的方法重载。 - 参数匹配逻辑问题:直接使用
new TimeSpan(...)作为匹配参数时,Moq会默认按实例引用(值类型按严格值匹配)校验,若测试代码与业务代码中创建的TimeSpan实例存在细微差异(或编译器无法推断匹配逻辑),会导致编译或运行时匹配失败。
修正后的测试代码
// 指定泛型参数,同时使用Moq的参数匹配器来匹配TimeSpan值 _mockRediscacheProvider.Setup(x => x.GetCache<IDictionary<Guid, DataExportRequestModel>>( CacheName.Redis.ToString(), It.Is<TimeSpan>(ts => ts.TotalDays == _cacheTTLDays) ));
简化匹配的可选方案
如果_cacheTTLDays是固定值(比如2),可以用更简洁的匹配方式:
_mockRediscacheProvider.Setup(x => x.GetCache<IDictionary<Guid, DataExportRequestModel>>( CacheName.Redis.ToString(), It.IsEqualTo(TimeSpan.FromDays(_cacheTTLDays)) ));
内容的提问来源于stack exchange,提问作者Rishikesh Kumar
相关产品推荐
相关产品推荐

