2016-08-22 2 views
2

Я использую библиотеку Fluent Assertion как часть моих модульных тестов для некоторого кода пользовательского кода сериализации, и я ищу способ заставить ShouldBeEquivalent сравнить с равным нулевым и пустым списком ,FluentAssertions - как make ShouldBeEquivalentTo сравнить пустые и нулевые как равные

В основном, мои тесты выглядеть так:

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

Однако одна из особенностей методы десериализации является то, что если тип коллекции отсутствует во входных данных, он устанавливает свойство на десериализованном классе в пустой список, а не в null. Итак, очень упрощенно, я получаю ситуацию, когда в примере два, 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 (предикат).

Смежные вопросы