如何moq和覆盖构造函数?

时间:2013-11-12 14:28:23

标签: c# mocking moq

是否可以使用Moq库moq并覆盖构造函数?

我有一个这样的课程:

public class A{
    private string _b;
    public A()
    {
        _b = Service.getB();
    }
    public int duplicate(int a){
       return a*2;
    }
}

我想测试方法“duplicate”,但是我无法实例化A类型的对象,因为我缺少一些依赖项。我可以以某种方式覆盖/模拟构造函数,以便创建一个对象并用它来测试其他方法吗?

更改应仅在测试中应用,我不应更改A类

3 个答案:

答案 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);