2016-07-14 8 views
4

私はのDTOとしてオブジェクトを受信して​​いると私は、ビュー・モデルに変換していたプロジェクトを持っています。この変換を行うために、DTOプロパティからView-Modelsに変換するためにいくつかの計算を行うカスタムコンバータを作成することにしました。これらのすべては準備ができていた、と変換が働いていた後、私は(私はこれがTDDを尊重していない知っているが、これは私がやって管理するものである)、それはより安定にするために変換するためにいくつかのユニットテストを追加したいです。私はビューモデルのいずれもEqualsメソッドを定義していない、と彼らは基準と同等になることはありませんのでテストは2ビュー・モデルユニットテストで2つのオブジェクトの等価性をテストする方法は?

Assert.AreEqual(expected, actual); 

の平等を確認したいとき

問題が来ます。

  1. Equalsメソッドを定義するには:私が考えたし、これらのオブジェクトを比較することが判明いくつかのアプローチがあります。しかし、それを定義するのがよいのかどうかは、テスト目的のためだけにはわかりません。私が定義した場合、GetHashCodeメソッドも定義することをお勧めします。だから、この解決策が最高だとは感じません。

  2. もう一つの可能​​性は、テストプロジェクトでIEqualityComparer<T>を実装し、メインの変換プロジェクトから比較ロジックを分離したり、これを第3のプロジェクトに抽出したりして、変換モジュールが将来必要に応じて使用できるようにすることです。この実装はうまくいくようですが、テストする必要があるクラスがたくさんある別のプロジェクトを追加する価値があるかどうかはわかりません。

  3. 私がStack Overflow questionで見つけた3番目のアプローチは興味深いようですが、両方のオブジェクトをシリアル化して文字列を比較することです。問題は、これがプログラミングの良い習慣であるかどうかわかりません。

オブジェクトの比較に最適な方法はどれですか?より効率的なアプローチがいくつかありますか?

注:ビュー・モデルは、複雑なオブジェクトである、と私は他の技術への変換の方法を変更することはできません。

+0

同じ種類のものでなければ、逐次化は信頼できません。同じプロパティを持つ2つの型が別々にシリアル化できる理由はたくさんあります。 –

+0

@DStanleyこれらは常に同じ型です。つまり、現時点では見えますが、ジェネリック型のパラメータを持つメソッドを、両方のオブジェクトを受け取る '単純な比較 'ではなく' Equality'からそれを直列化して文字列比較を返しますか?この方法では十分に安定していますか? – meJustAndrew

+0

@Dスタンリーあなたがこの質問を閉じるのに投票したのは広すぎると思うが、ヘルプセンターを読んで広すぎるということを意味している。本の穴の内容を傷つけることを必要とするか、本当に長い答えでさえ必要としない。多くの他のプログラミングの質問が複数の答えを持つことができると考えてください。良いものはありますが、どれも*広すぎる*。ありがとうございました! – meJustAndrew

答えて

2

あなたの第二のアプローチは、他の2つのよりもはるかに優れている、それは一緒にテスト固有のコードを保持しますので、また、2つのView-Modelsが同じであることの定義を変更できるためです。

これは、しかし、別のプロジェクトに平等にする比較器を移動するために、それはほとんど価値がある:あなたが等価比較ロジックを共有する場合、あなたは同様にあなたのオブジェクトにそれを置くかもしれません。一方、テスト用にのみ設計されている場合は、テストと一緒に保つ必要があります(つまり、アプローチ#1を使用します)。それは無関係の機能に依存するため

シリアライズに基づくアプローチは、あまりにも脆弱である(すなわち、シリアル化)を使用して、実際にテストしている機能(つまり変換)をテストします。

3

私は本当に流暢アサーションのShouldBeEquivalentTo方法などがあります。デフォルトでは

actual.ShouldBeEquivalentTo(expected); 

が、これはあなたが構造的に等価である渡すオブジェクトの両方を想定し、「ただ働き」、しかし、あなたはそれが比較をしたい方法をカスタマイズするために追加の引数を提供することができます。あなただけのオブジェクトのいくつかの作品の等価性を確認したい場合たとえば、あなたが言うことができる:

actual.ShouldBeEquivalentTo(new { 
    expected.Name, 
    expected.Description, 
    expected.Code 
}, options => 
    options.ExcludingMissingMembers); 
関連する問題