c# - 最小起订量返回未被调用

标签 c# .net generics moq

我有一个类(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的具体执行有一个 TResultList<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/

相关文章:

.net - 使用 .NET 中的 libpurple

java - 如何使用带有通配符声明的泛型类?

xcode - Swift - 无法显式专门化泛型函数

C# MS Project Interop - 获取资源的工作时间

C# 全屏控制台?

c# - 有没有办法在 C# 中直接从磁盘填充和使用变量?

c# - 在 VS 2008 中使用 SAP.net Connector 的分步教程

c# - Winforms 进度条无法正常工作

c# - Python 到 C# AES CBC PKCS7

C#泛型和继承问题