是否可以使用最小起订量库覆盖构造函数?
我有这样的课程:
public class A{
private string _b;
public A()
{
_b = Service.getB();
}
public int duplicate(int a){
return a*2;
}
}
我想测试方法"复制",但我无法实例化类型 A 的对象,因为我缺少一些依赖项。我可以以某种方式覆盖/模拟构造函数以创建一个对象并将其用于测试其他方法吗?
更改应仅在测试中应用,我不应更改A类。
不可能使用 Moq 框架覆盖或模拟构造函数。
即使您尝试创建TestA
类并从A
继承它,无参数构造函数也会被调用。您可以在下面的文章"C# 中的构造函数"中阅读更多内容。MSDN还引用了一句话:
如果类不包含实例构造函数声明,则默认 自动提供实例构造函数。该默认值 构造函数只是调用直接的无参数构造函数 基类。如果直接基类没有可访问的 无参数实例构造函数,则发生编译时错误。
如果确实需要覆盖构造函数,您可以查看另一个模拟框架(例如,TypeMock甚至可以模拟静态构造函数)
有这样一个问题"使用什么C#模拟框架?",有一长串的模拟框架和演示"模拟框架之战",可能会帮助你选择正确的工具。
那么Service
到底是什么?更好的设计是将其作为构造函数的参数放入。然后,您可以模拟/存根它,并能够在没有任何硬编码依赖项的情况下测试您的duplicate
方法。
理解正确,您可以做的是在内部创建一个新的构造函数,以便您可以从外部注入依赖项(或使用任何依赖项注入框架)
internal A(B b)
{
_b = b;
}
因此,您无需更改其他程序集的公共 API,并在测试程序集中添加程序集的属性.cs
[InternalsVisibleTo("YourTestAssembleNamespace.TestClass.dll")]
所以在你的测试中,你会做这样的事情
//bmock = new Mock<IB>();
var A = new A(bmock);