2016-08-22 14 views
2

私はFluent Assertionライブラリをカスタムシリアライゼーションコードの単体テストの一部として使用していますが、ShouldBeEquivalentToをnullと空のリストと等しいものとして比較する方法を探しています。FluentAssertions - どのようにしてShouldBeEquivalentToが空とnullを等しいとして比較するか

基本的には、私のテストのようなものに見える。しかし

[Test] 
    public void Should_be_xxx() 
    { 
     ClassWithList one = new ClassWithList { Id = "ten", Items = null }; 

     string serialized = Serialize(one); 
     ClassWithList two = Deserialize(serialized); 

     two.ShouldBeEquivalentTo(one); 
    } 

を、逆シリアル化方法の特徴の一つは、コレクション型は、入力データに欠落している場合、それは非直列化されたクラスのプロパティを設定していることですヌルではなく空のリストに変換します。だから、非常に簡略化され、私は事実上2つ、Items = new List<string>ではなくnullに終わる。

明らかに、私は比較する前にone.Items = new List<string>()を設定することができましたが、実際に私はこれらの方法でアサーションしている複雑なドメインオブジェクトが非常に多く、一般的な解決策を探しています。別の言い方をするには、以下の試験合格にする方法を誰もが知っている:それは別の言い方をすると

public class ClassWithList 
    { 
     public string Id { get; set; } 
     public List<string> Items { get; set; } 
    } 

    [Test] 
    public void Should_be_xxx() 
    { 
     ClassWithList one = new ClassWithList { Id = "ten", Items = null }; 
     ClassWithList two = new ClassWithList { Id = "ten", Items = new List<string>() }; 

     two.ShouldBeEquivalentTo(one); 
    } 

を、私は等価性を比較するの一環として、クラスX内のすべてのコレクションに次の試験を適用するために探しています:

if (subject.Items == null) 
    { 
    expected.Items.Should().BeEmpty(); 
    } 
    else 
    { 
    expected.Items.Should().BeEquivalentTo(subject.Items); 
    } 

答えて

1

、私はこれがあろう次の実際のコード解決することができた:

public class ClassWithList 
    { 
     public string Id { get; set; } 
     public List<string> Items { get; set; } 
     public List<ClassWithList> Nested { get; set; } 
    } 

    [TestClass] 
    public class Test 
    { 
     [TestMethod] 
     public void Should_compare_null_to_empty() 
     { 
      ClassWithList one = new ClassWithList { Id = "ten", Items = null, Nested = new List<ClassWithList> { new ClassWithList { Id = "a" } } }; 
      ClassWithList two = new ClassWithList { Id = "ten", Items = new List<string>(), Nested = new List<ClassWithList> { new ClassWithList { Id = "a", Items = new List<string>(), Nested = new List<ClassWithList> { } } } }; 

      two.ShouldBeEquivalentTo(one, opt => opt 
       .Using<IEnumerable>(CheckList) 
       .When(info => typeof(IEnumerable).IsAssignableFrom(info.CompileTimeType))); 
     } 

     private void CheckList(IAssertionContext<IEnumerable> a) 
     { 
      if (a.Expectation == null) 
      { 
       a.Subject.Should().BeEmpty(); 
      } 
      else 
      { 
       a.Subject.ShouldBeEquivalentTo(a.Expectation, opt => opt 
        .Using<IEnumerable>(CheckList) 
        .When(info => typeof(IEnumerable).IsAssignableFrom(info.CompileTimeType))); 
      } 
     } 
    } 
1

カスタム 'IEquivalencyStep' またはu.se「options.Using(カスタムアクション).WhenTypeIs(述語)を実装する必要があります。上記デニスからの情報に基づいて

関連する問題