Утверждают, что все свойства, но некоторые являются нулевыми - PullRequest
0 голосов
/ 13 июня 2018

У меня есть методы отображения, которые отображают модель A на модель B.Я пишу модульные тесты для всего этого.Я хочу как-то хорошо справиться с ситуацией, когда у модели назначения много свойств, но большинство из них null.Цель теста состоит в том, чтобы проверить, что некоторое небольшое количество свойств было правильно сопоставлено, а другие не были сопоставлены вообще (не было установлено ничего, кроме заданных свойств) без необходимости указывать каждое свойство.

Я не могу изменить B class, потому что обычно это сервисный контракт, который я вызываю только с несколькими свойствами из многих.

Не могли бы вы помочь, как упростить модульный тест?

Я использую .NET Core 2.1и NUnit.

Пример текущего состояния:

public class B
{
    public string Id { get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public string Prop4 { get; set; }
    public string Prop5 { get; set; }
    // a lot of other properties
}

Метод отображения:

public B Map(A a)
{
    return new B
    {
        Id = a.Id // only Id property is set
    };
}

Тест:

[Test]
public void MapTest()
{
    var a = new A { Id = "123" };
    var b = mapping.Map(a);

    Assert.That(b, Is.Not.Null);
    Assert.That(b.Id, Is.EqualTo(a.Id));

    Assert.That(b.Prop1, Is.Null); // this is what i want to simplify
    Assert.That(b.Prop2, Is.Null);
    Assert.That(b.Prop3, Is.Null);
    Assert.That(b.Prop4, Is.Null);
    Assert.That(b.Prop5, Is.Null);
    // a lot of other properties
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Сожалею, что нет способа сделать это в собственных утверждениях NUnit.Вы можете инкапсулировать логику в методе, который принимает список имен свойств и использует отражение.Вот как я делал это в подобных случаях.

Удобный способ упаковать логику - написать

Assert.That(b, Has.Properties("Prop1", "Prop2", ...).Null;

, где Has.Properties заменит аргумент b спискомвсе значения именованного свойства, а затем применить к нему следующее ограничение.

Это кажется недостаточно общим для включения в сам NUnit, но выполнимо как пользовательское ограничение.

Другой способ сделать этобыло бы написать

Assert.That(b.Properties("Prop1", "Prop2"...), Is.All.Null);

, где Properties - метод расширения для object.

Третьим вариантом (возможно, самым простым) будет расширение ListMapper.

в NUnit.
0 голосов
/ 13 июня 2018

Инфраструктура FluentAssertions имеет функцию для утверждения всего объекта.
Создание ожидаемого экземпляра и утверждение его относительно фактического результата метода карты.

[Test]
public void MapTest()
{
    var a = new A 
    { 
        Id = "123",
        Name = "Name of A",
        SomeProperty = new LowLevelClass { Value = 42 } 
    }; 
    var expected = new B 
    { 
        Id = "123"
    };

    var actual = mapping.Map(a);

    actual.Should().BeEquivalentTo(expected);
}

В приведенном выше примере предполагается, что конструктор по умолчаниюиз B не создавать экземпляры других свойств, но если это так, то вы создадите ожидаемый экземпляр B, а explicilty задает для других свойств значение null

var expected = new B 
{ 
    Id = "123",
    Name = null,
    SomeProperty = null
};

var actual = mapping.Map(a);

actual.Should().BeEquivalentTo(expected);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...