Правильный подход к тестированию конвертируемых методов - PullRequest
1 голос
/ 20 апреля 2011

Предположим, у меня много таких классов (Foo1, Foo2 ..)

class Foo 
{
    public int F{get; set;}

    public Bar ConvertToBar ()
    {
        return new Bar(){ B = this.F*10 };
    }
}

Все, что у них общего, - это метод ConvertToBar ().

У меня есть два подхода к единице-проверить этот метод:

  1. Вызвать преобразование в ConvertToBar () и проверить все его свойства (я должен сделать это во всех тестах для каждого класса, как Foo)

    Barbar = foo.ConvertToBar ();Assert.AreEqual (Ожидаемое значение, bar.Property);...

  2. Написать вспомогательный метод, который сравнивает два экземпляра Bar и затем использует его следующим образом:

    Bar Ожидаемый бар = Новый бар () Assert.True (barCompareMethod (Ожидаемый бар), foo.ConvertToBar ());

Как лучше написать модульный тест для этого метода?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Как предлагает Джон Скит, реализация пользовательского равенства в Bar - это отличная идея, если вы понимаете, как избежать Загрязнение равенства .

Для семантического сравнения вы можете использовать AutoFixture Библиотека SemanticComparison, которая позволит вам написать утверждение следующим образом:

var expected = bar1.AsSource().OfLikeness<Bar>();
expected.ShouldEqual(bar2);

Метод ShouldEqual - это пользовательское утверждение, которое сравнивает каждое свойство (сопоставляемое по имени) иуспешно, когда все свойства равны;в противном случае он выдаст описательное исключение.

4 голосов
/ 20 апреля 2011

Имеет ли смысл для Bar быть IEquatable<Bar>?Если это так, я бы реализовал это в вашем производственном коде, вместо использования вспомогательного метода.Тогда вы можете просто использовать Assert.AreEqual(expectedBar, actualBar).

3 голосов
/ 20 апреля 2011

Я не уверен, что есть лучший способ.

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

    Assert.That (someObject, Has.Property ("Version"). EqualTo ("2.0"));

  • во-вторых, это немного больше работы, так как вам нужно определить Equals в классах Bar (может возникнуть проблема, если у вас нет прав на редактирование исходного кода).Но было бы предпочтительнее, если необходимо установить большое количество свойств.

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