Как использовать TestCase в NUnit 2.5? - PullRequest
8 голосов
/ 15 января 2012

У меня есть класс Currency, который я сохраняю в своей базе данных, используя NHibernate. Currency класс выглядит так:

public class Currency : Entity
{
    public virtual string Code { get; set; }
    public virtual string Name { get; set; }
    public virtual string Symbol { get; set; }        
}

Я написал модульный тест, используя [TestCase], например:

    [TestCase(6,Result = new Currency ({ Code="GBP", Name="British Pound", Symbol="£"}))]
    public Currency CanGetCurrencyById(int id)
    {
        ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session);
        Currency c = currencies.GetById<Currency>(id);

        return c;
    }

Я знаю, что это неправильно, но я не уверен, как это написать. Может ли результат быть object?

Ответы [ 2 ]

17 голосов
/ 15 января 2012

Аргумент атрибута (для Result) должен быть константным выражением. Вы не можете создавать объекты, как сейчас.

Использование атрибута TestCase подходит для тестирования случаев, когда необходимо проверить несколько простых входов / выходов. Однако в вашем сценарии вы можете сделать что-то вроде этого (то есть, если вы планируете только проверить правильность сопоставления id-кода):

[TestCase(6, Result = "GBP")]
[TestCase(7, Result = "USD")]
[TestCase(8, Result = "CAD")]
public string CanGetCurrencyById(int id)
{
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session);
    Currency c = currencies.GetById<Currency>(id);

    return c.Code;
}

Кроме того, взгляните на TestCase документацию - они дают довольно хорошие примеры.

Редактировать : Под тестированием отображений я имел в виду проверку правильности ваших отображений ORM (от NHibernate до базы данных) и их правильной работы. Вы обычно проверяете это в следующем сценарии:

  1. Создать новый экземпляр сущности с предопределенными значениями (например, Currency)
  2. Начало новой транзакции
  3. Сохранить сущность (Save + Flush + Evict комбинация, чтобы NHibernate больше не сохранял сохраненную сущность в кеше)
  4. Получить сущность
  5. Сравнить полученные значения с предопределенными
  6. Откат транзакции

Если такой тест затем проходит, он более или менее говорит вам, что Я могу сохранить эту сущность с этими значениями, а затем могу получить ее с точно такими же значениями . И это все, что вы хотели знать - отображения верны.

С атрибутом TestCase tho проверить правильность целых объектов довольно сложно - он предназначен для тестирования простых вещей. Вы можете использовать обходные пути, как предложено в другом ответе (передача аргументов через TestCase), но он быстро становится нечитаемым и сложным в обслуживании (представьте сущность с 6+ свойствами для проверки).

Я предлагаю разделить ваш тест на тот, который проверяет, является ли сопоставление id к code правильным (однако я не вижу особого смысла в этом, если только вы не всегда не планируете сопоставлять определенные идентификаторы с определенные коды), а другой проверяет, правильно ли сопоставлен объект Currency с таблицей базы данных.

5 голосов
/ 15 января 2012

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

[TestCase(6, "GBP", "British Pound", "£")]
public void CanGetCurrencyById(int id, string code, string name, string symbol)
{
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session);
    Currency c = currencies.GetById<Currency>(id);
    Assert.That(c, Is.EqualTo(new Currency(code, name, symbol)));
}
...