2

是否可以使用 Moq 库来最小起订量并覆盖构造函数?

我有这样的课:

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

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

更改应仅应用于测试,我不应该更改 A 类

4

3 回答 3

2

不可能使用Moq 框架覆盖或模拟构造函数。

即使您尝试创建TestA类并从 继承它A,无论如何都会调用无参数构造函数。您可以在以下文章“C# 中的构造函数”中阅读更多内容。MSDN还引用了一段话:

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。

如果确实需要覆盖构造函数,您可以查看另一个模拟框架(例如TypeMock甚至可以模拟静态构造函数)

有这样的问题“要使用什么 C# 模拟框架?” 有一长串模拟框架和演示文稿“模拟框架之战”,可能会帮助您选择正确的工具。

于 2013-11-13T23:34:41.757 回答
1

那么究竟是Service什么?更好的设计是将其作为构造函数的参数。然后你可以模拟/存根,并且能够在duplicate没有任何硬编码依赖项的情况下测试你的方法。

于 2013-11-12T14:30:55.583 回答
-1

如果我理解正确,您可以做的是在内部创建一个新的构造函数,以便您可以从外部注入依赖项(或使用任何依赖项注入框架)

internal A(B b)
{
    _b = b;
}

因此您无需更改其他程序集的公共 API,并在您的测试程序集中将属性添加到 assembly.cs

[InternalsVisibleTo("YourTestAssembleNamespace.TestClass.dll")]

所以在你的测试中你会做这样的事情

//bmock = new Mock<IB>();
var A = new A(bmock);
于 2013-11-12T14:42:57.217 回答