7

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);

ただし、これは非常に面倒です。クラスObject2に新しいメンバーを追加するたびに、単体テスト(または少なくとも単体テストヘルパー)を修正する必要があるためです。

「両方のオブジェクトに存在するサブセットについてのみ類似性を比較したい」と言う方法はありますか?

4

1 に答える 1

8

プロパティの交差に基づいて 2 つのオブジェクトを比較したいようです。これは現在、Likeness クラスではサポートされていません。理由は次のとおりです。

現在、宛先タイプ (上記の例では Object2) が、マッチングが行われる決定的なテンプレートです。これは、アサーションの非常に強力なステートメントを提供します。このクラスのすべてのパブリック プロパティまたはフィールドが一致する必要があります。

ただし、プロパティの交差の一致に関するステートメントは、交差が空になる可能性があるため、非常に弱いステートメントになります。これにより、偽陰性が発生する可能性があります。

TDD を行って Red/Green/Refactor サイクルに従っている場合でも、ユニット テストがそのような架空の Likeness 交差で失敗するのを見たことがある場合でも、最後のプロパティまたはフィールドを削除すると、その後のリファクタリングでそのようなアサーションが False Negative に変わる可能性があります。この 2 つのオブジェクトには共通点があります。

ただし、AutoFixture はすべてオープン ソースであるため、この機能を提案するか、プル リクエストを送信してください。

于 2012-02-18T13:05:58.747 に答える