3

同じ型の 2 つのオブジェクトをメンバーごとに比較する必要がある単体テストを作成しています。私は SemanticComparison ライブラリを使用して、カスタム比較コードを記述せずにこのタスクを処理することにしました。フラットオブジェクトを比較するときに非常にうまく機能します。オブジェクトにネストされたオブジェクトが含まれている場合、メンバーごとに比較する必要がある場合に問題があります。

public class Outer
{
    public string Name { get; set; }
    public Inner Inner { get; set; }
}

public class Inner
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Service
{
    public Outer Method()
    {
        return new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }
        };
    }
}

内部オブジェクトはメンバーごとではなく参照によって比較されるため、これは機能しません。

    [Test]
    public void SimpleTest1()
    {

        // setup
        var expectedLikeness = new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }
        }.AsSource().OfLikeness<Outer>();

        var sut = new Service();
        // exercise sut
        var actual = sut.Method();
        // verify
        expectedLikeness.ShouldEqual(actual);
    }

それを機能させるには、ネストされたオブジェクトのプロキシを作成して、デフォルトの equals 実装をオーバーライドする必要がありました。

    [Test]
    public void SimpleTest2()
    {

        // setup
        var expectedLikeness = new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }.AsSource().OfLikeness<Inner>().CreateProxy()
        }.AsSource().OfLikeness<Outer>();

        var sut = new Service();
        // exercise sut
        var actual = sut.Method();
        // verify
        expectedLikeness.ShouldEqual(actual);
    }

正しく動作しますが、サービス コードのリファクタリングを行った後、Inner クラスの value プロパティが期待値と異なるバグが発生したとします。SemanticComparison の優れた機能は、不平等の原因となったメンバーの名前をログに記録できることです。ただし、この場合、Inner クラスの特定のプロパティの名前ではなく、"Inner" のみが不一致として返されます。

何か不足していますか?実際の不一致メンバーを返すことができるように構成することは可能ですか?

これは明らかに、この例のような単純なデータ構造では問題になりませんが、実際のコードをテストするには不便になる可能性があります。

4

2 に答える 2