我正在創建將需要比較相同類型成員的兩個對象的單元測試。我決定使用SemanticComparison庫來處理此任務,而無需編寫自定義比較器代碼。它在比較平面對象時非常有效,當對象包含也需要比較成員的嵌套對象時會出現問題。使用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);
}
爲了使它工作,我不得不創建嵌套對象的代理,以使其覆蓋默認等於實施。
[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);
}
好,它工作正常,但試想,經過一些服務代碼重構我們引入,使內部類的值屬性是與預期值不同的bug。 SemanticComparison的一個很酷的功能是它可以記錄導致不平等的成員的名字。但是,在這種情況下,它只會返回「Inner」作爲不匹配,而不是Inner類中特定屬性的名稱。
我錯過了什麼嗎?是否可以將其配置爲能夠返回實際不匹配的成員。
對於本例中的簡單數據結構來說,這顯然不是問題,但它可能是測試真實生活代碼的不便之處。
難道是很容易能夠做出某種自動內/自動代理相似的?我有深度和廣泛的嵌套數據結構,我想與構造的測試數據或數據庫/序列化往返結果進行比較。即'expected.AsSource().Likeness().WithAutoLikeness()。ShouldEqual(actual).' –
Holstebroe
我認爲,當我創建這些擴展。但是,據我所知,沒有對原始圖書館進行修改是不可能的,需要一些思考。 – JMansar
對不起,但這不適用於.NET標準:( – SuperJMN