同じ型の 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" のみが不一致として返されます。
何か不足していますか?実際の不一致メンバーを返すことができるように構成することは可能ですか?
これは明らかに、この例のような単純なデータ構造では問題になりませんが、実際のコードをテストするには不便になる可能性があります。