2016-09-08 12 views
0

FluentAssertionsを使用しています。オブジェクトのリストを2つ比較する必要があります。それらはValuesプロパティを含む同じクラスからのものです。.Net FluentAssertions。オブジェクトが正しくオブジェクトを比較しません。

両方のリストを比較したいが、list1のすべての値をlist2に存在させたいが、余分な値は無視する。このような何か:

using System.Collections.Generic; 
using FluentAssertions; 

public class Program 
{ 

    public class Value 
    { 
     public int Id { get; set; } 
     public string SomeValue { get; set; } 
    } 

    public class MyClass 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<Value> Values { get; set; } 
    } 


    public static void Main() 
    { 
     var list1 = new List<MyClass> 
     { 
      new MyClass 
      { 
       Id = 1, 
       Name = "Name 1", 
       Values = new List<Value> 
       { 
        new Value {Id = 1, SomeValue = "Test" } 
       } 
      } 
     }; 

     var list2 = new List<MyClass> 
     { 
      new MyClass 
      { 
       Id = 1, 
       Name = "Name 1", 
       Values = new List<Value> 
       { 
        new Value {Id = 1, SomeValue = "Test" }, 
        new Value {Id = 2, SomeValue = "Test" } 
       } 
      } 
     }; 

     list2.Should().HaveSameCount(list1); 

     // This doesn't throw, just proving that the first object is equivalent 
     list2[0].Values[0].ShouldBeEquivalentTo(list1[0].Values[0]); 
     for (var x = 0; x < list2.Count; x++) 
     { 
      list2[x].ShouldBeEquivalentTo(list1[x], options => options.Excluding(s => s.Values)); 
      // This throws, but it shouldn't 
      list2[x].Values.Should().Contain(list1[x].Values); 
     } 

    } 
} 

しかし、これはスロー:

期待コレクション{

プログラム値{ID = 1 someValueの= "テスト"}、

プログラム+ +値{ Id = 2 SomeValue = "テスト"}}含まれる

プログラム+値{Id = 1 SomeValue = "テスト"}

だからいくつかの質問:予想通り

  1. なぜ働いて入っていないですか?

  2. ShouldBeEquivalentToではなくContainsを使用するようにデフォルトリストの比較を変更するなど、1行で行うことは可能ですか?

  3. クラスのコレクションからプロパティを除外するにはどうすればよいですか? 私はthis questionthis oneを見ましたが、コレクションには当てはまりません。また、PropertyPathを使用しようとすると、プログラムはコンパイルされません。私は.Net Coreを使用していますが、私も4.6で試してみました。

答えて

1

問題がLIST1とLIST2内のオブジェクト new Value {Id = 1, SomeValue = "Test" } は、2つの完全に独立した別のオブジェクトは、プロパティが同じであることは問題であるということですので、私はあなたの最初の質問に答えることができます。あなたはこれにそれを変更する場合 は、それはあなたが

var commonValue = new Value { Id = 1, SomeValue = "Test" }; 

    var list1 = new List<MyClass> 
    { 
     new MyClass 
     { 
      Id = 1, 
      Name = "Name 1", 
      Values = new List<Value> 
      { 
       commonValue 
      } 
     } 
    }; 

    var list2 = new List<MyClass> 
    { 
     new MyClass 
     { 
      Id = 1, 
      Name = "Name 1", 
      Values = new List<Value> 
      { 
       commonValue, 
       new Value {Id = 2, SomeValue = "Test" } 
      } 
     } 
    }; 
+0

はい、しかし、私は同値を比較したいと思います。この場合、次の行に示すように例外がスローされるべきではありません: list2 [0] .Values [0] .ShouldBeEquivalentTo(list1 [0] .Values [0]); –

0

ちょうどShouldBeEquivalentToを使用する期待どおりに動作します。それは、構造的等価性のための2つのオブジェクトグラフを比較する。

+0

コレクションの1つで余分なアイテムを無視する必要があるため、これは機能しません。 –

+0

http://www.continuousimprover.com/2012/09/asserting-object-graph-equivalence.htmlを参照してください。 –

関連する問題