如何修改和覆盖构造函数



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

我有这样的课程:

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

最新更新