Autofixtureの類似性 - 一致するプロパティのみを比較します
-
27-10-2019 - |
質問
autofixture.semanticcomparisonを使用して、類似性について次の2つのオブジェクトを比較できるようにしたい:
public class Object1
{
public int a;
}
public class Object2
{
public int a;
public int b;
}
さて、私がこのようにそれをするとき:
var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2);
次の例外が得られます。「次のメンバーは一致しませんでした:-b。」
このような「B」メンバーを省略できることがわかりました。
var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2);
ただし、Class Object2に新しいメンバーを追加するたびに、ユニットテスト(または少なくとも単体テストヘルパー)を修正する必要があるため、これは非常に面倒だと思います。
「両方のオブジェクトに存在するサブセットのためだけに肖像のために比較したい」と言う方法はありますか?
解決
に基づいて2つのオブジェクトを比較したいように聞こえます 交差点 それらのプロパティの。これは現在、肖像クラスではサポートされていません。理由はこれです:
現在、宛先タイプ(上記の例では、オブジェクト2になります)は、マッチングが行われる決定的なテンプレートです。これはかなりのものを提供します 強い 主張の声明: このクラスのすべての公共財産またはフィールドは一致する必要があります。
ただし、プロパティの交差点と一致することに関する声明は非常に 弱い 声明、それはそれだから 交差点が空になる可能性があります. 。これは結果として生じる可能性があります 偽陰性.
あなたがtddingであり、赤/緑/リファクタルサイクルに従っていて、そのような仮説的な肖像の交差点で単位テストが失敗するのを見たとしても、その後のリファクタリングは、最後のプロパティまたはフィールドを削除するときに、そのようなアサーションを偽陰性に変えるかもしれません2つのオブジェクトには共通点があります - そして、あなたは決して気付かないでしょう。
ただし、オートフィックスはオープンソースであり、すべてですので、歓迎します この機能を提案します または、プルリクエストを送信します。