我有一个类(class)收到 ICacheManager
通过注入(inject):
public ClientIdToClientNameResolver(IDataManager<Client> clientManager, ICacheManager cacheManager, ILogUtils logUtils)
{
this.clientManager = clientManager;
this.cacheManager = cacheManager;
this.logUtils = logUtils;
}
然后有一行代码执行Get
方法:
var client = cacheManager
.Get(CacheKeys.Clients, () => clientManager.Get())
.FirstOrDefault(x => x.Id == clientId);
该方法的签名是:
TResult Get<TResult>(string key, Func<TResult> defaultValue = null)
Get
的具体执行有一个 TResult
的 List<Client>
所以我像这样模拟它:
var cacheManagerMock = new Mock<ICacheManager>();
cacheManagerMock.Setup(m => m.Get(It.IsAny<string>(), It.IsAny<Func<List<Client>>>()))
.Returns(new List<Client>());
但是,在执行测试时,调用:
var client = cacheManager
.Get(CacheKeys.Clients, () => clientManager.Get())
正在返回 null
.我知道这一点,因为在之前的迭代中我自己打破了那个声明。我做错了什么 Mock
?
最佳答案
以下 [mcve] 用于根据提供的原始示例尝试重现问题。
[TestClass]
public class UnitTest4 {
[TestMethod]
public void TestMethod1() {
//Arrange
var clients = new List<Client>(){
new Client { Id = 1 }
};
var cacheManagerMock = new Mock<ICacheManager>();
cacheManagerMock
.Setup(m => m.Get(It.IsAny<string>(), It.IsAny<Func<List<Client>>>()))
.Returns(clients);
var clientId = 1;
var clientManager = Mock.Of<IDataManager<Client>>();
var cacheManager = cacheManagerMock.Object;
//Act
var client = cacheManager
.Get(CacheKeys.Clients, () => clientManager.Get())
.FirstOrDefault(x => x.Id == clientId);
//Assert
Assert.IsNotNull(client);
}
public class Client { public int Id { get; set; } }
public interface ICacheManager {
TResult Get<TResult>(string key, Func<TResult> defaultValue = null);
}
public interface IDataManager<T> {
List<T> Get();
}
public class CacheKeys {
public const string Clients = "FakeKey";
}
}
但是测试按预期通过了。
关于c# - 最小起订量返回未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43916592/