是否可以使用Moq库moq并覆盖构造函数?
我有一个这样的课程:
public class A{
private string _b;
public A()
{
_b = Service.getB();
}
public int duplicate(int a){
return a*2;
}
}
我想测试方法“duplicate”,但是我无法实例化A类型的对象,因为我缺少一些依赖项。我可以以某种方式覆盖/模拟构造函数,以便创建一个对象并用它来测试其他方法吗?
更改应仅在测试中应用,我不应更改A类。
答案 0 :(得分:2)
使用Moq framework无法覆盖或模拟构造函数。
即使您尝试创建TestA
类并从A
继承它,无论如何都将调用无参数构造函数。您可以在以下文章"Constructors in C#"中阅读更多内容。还有MSDN的引用:
如果类不包含实例构造函数声明,则为默认值 实例构造函数是自动提供的。那个默认 构造函数只是调用direct的无参数构造函数 基类。如果直接基类没有可访问性 无参数实例构造函数,发生编译时错误。
如果真的需要覆盖构造函数,你可以看看另一个模拟框架(例如TypeMock可以模拟静态构造函数)
SO question "What C# mocking framework to use?"有一长串模拟框架和演示文稿"Battle of the mocking frameworks",可以帮助您选择正确的工具。
答案 1 :(得分:1)
那究竟是什么Service
?更好的设计是将其作为参数添加到构造函数中。然后你可以模拟/存储它,并且能够测试你的duplicate
方法而没有任何硬编码的依赖。
答案 2 :(得分:-1)
如果我理解你能做什么就是创建一个新的构造函数内部
internal A(B b)
{
_b = b;
}
因此您不要更改其他程序集的公共API,并且在Test程序集中为assembly.cs添加属性
[InternalsVisibleTo("YourTestAssembleNamespace.TestClass.dll")]
所以在你的测试中你会做这样的事情
//bmock = new Mock<IB>();
var A = new A(bmock);