我正在尝试创建一个简单的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; }
}
我想我在这里缺少一些概念,但是我无法理解它是什么
答案 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