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

protectedこのようなorコンストラクターを持つことinternalは非常に一般的です。これは、Dependency Injectionでテストを行っているためです。

コードを通常呼び出すと、のインスタンスが作成されますがSomeOtherClass、単体テストを実行すると、SomeOtherClassそれをシミュレートするモック バージョンを渡すことができます (たとえばSomeOtherClass、データ レイヤー インターフェイスでSomeClassあり、ビジネス ロジック レイヤー クラスであり、モック クラスです)。 DB への呼び出しを偽装し、DB に接続されているかのように結果を返します)

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 に答える