自从我指定返回值以来,为什么要调用Mocked类构造函数?

时间:2018-10-09 01:28:48

标签: c# unit-testing moq

我正在尝试创建一个简单的Moq示例,以模拟通过构造函数的类:

string apiKey = "123";

Mock<YTAuthentication> authentication = new Mock<YTAuthentication>(apiKey);
authentication.Setup(p => p.ApiKey).Returns("123_c");
string toTest = authentication.Object.ApiKey;

问题是它返回“ 123”而不是“ 123_c”,我对构造函数断点了,并确认它被击中了

这是被嘲笑的类。

public class YTAuthentication : IYTAuthentication
{
    public virtual string ApiKey { get; }

    public YTAuthentication(string apiKey)
    {
        ApiKey = apiKey;
    }
}

public interface IYTAuthentication
{
    string ApiKey { get; }
}

我想我在这里缺少一些概念,但是我无法理解它是什么

1 个答案:

答案 0 :(得分:3)

您不需要传递apiKey作为模拟的参数,只需执行以下操作即可:

Mock<IYTAuthentication> authentication = new Mock<IYTAuthentication>(); // no arguments
authentication.Setup(p => p.ApiKey).Returns("123_c");
string toTest = authentication.Object.ApiKey;

您正在调用的Mock的重载将对象数组作为参数,并尝试使用传递给它的参数初始化模拟对象,从而覆盖设置。

编辑:

正如@JonathonChase所指出的那样,您无需模拟IYTAuthentication的具体实现,只需从接口中进行模拟即可,就像实现目标接口的匿名对象一样。并且假设您的代码遵循Dependency Inversion的良好原则,那么可以安全地假定您要测试的任何服务都不取决于具体的YTAuthentication而是取决于它的抽象{{1 }},因此按照这种良好做法,您的单元测试将如下所示:

IYTAuthentication