4

这是这个封闭问题的衍生,我有一个答案,但在我回答之前它就被关闭了。这是问题的调整版本:

为什么一个类会有一个只设置属性的内部构造函数?

public class SomeClass
{
    public SomeClass() : this(new SomeOtherClass()) { }
    internal SomeClass(SomeOtherClass c) { _someField = c; }

    private SomeOtherClass _someField;

    protected void SomeMethod() {
        var foo = _someField.Bar();
    }
}

这样做有什么好处,你为什么不这样做:

public class SomeClass
{
    public SomeClass() { _someField = new SomeOtherClass(); }

    private SomeOtherClass _someField;

    protected void SomeMethod() {
        var foo = _someField.Bar();
    }
}
4

1 回答 1

6

拥有这样的protectedorinternal构造函数非常常见,因为这是使用Dependency Injection进行测试。

当您正常调用代码时,它只会创建一个实例,SomeOtherClass但是当您运行单元测试时,您可以让它传递一个SomeOtherClass模拟它的模拟版本(假设SomeOtherClass是您的数据层接口,SomeClass是您的业务逻辑层类,模拟类伪造对数据库的调用并返回结果,就好像它已连接到数据库一样)

internal class UnitTest
{
    [Fact]
    public TestDbInterface()
    {
        var someClass = new SomeClass(new MockedSomeOtherClass())

        var result = someClass.SomeMethod()

        Assert.AreEqual("42", result);
    }
}

这允许您进行单元测试,而无需执行昂贵的操作,例如设置已知状态并在测试机器上运行完整的数据库服务器来测试不针对数据层类的测试。

于 2013-08-23T14:16:07.647 回答