Как установить DateTime как ValuesAttribute для модульного теста? - PullRequest
23 голосов
/ 03 декабря 2010

Я хочу сделать что-то вроде этого

[Test]
public void Test([Values(new DateTime(2010, 12, 01), 
                         new DateTime(2010, 12, 03))] DateTime from, 
                 [Values(new DateTime(2010, 12, 02),
                         new DateTime(2010, 12, 04))] DateTime to)
{
    IList<MyObject> result = MyMethod(from, to);
    Assert.AreEqual(1, result.Count);
}

Но я получаю следующую ошибку относительно параметров

Аргументом атрибута должно быть константное выражение, выражение typeof или создание массивавыражение

Есть предложения?


ОБНОВЛЕНИЕ: хорошая статья о параметризованных тестах в NUnit 2.5
http://www.pgs -soft.com/new-features-in-nunit-2-5-part-1-parameterized-tests.html

Ответы [ 3 ]

25 голосов
/ 05 декабря 2010

В качестве альтернативы раздутому модульному тесту вы можете разгрузить создание TestCaseData с помощью атрибута TestCaseSource.

Атрибут TestCaseSource позволяет вам определить метод в классе, который будет вызываться NUnit, и данные, созданные в методе, будут переданы в ваш тестовый пример.

Эта функция доступна в NUnit 2.5, и вы можете узнать больше здесь ...

[TestFixture]
public class DateValuesTest
{
    [TestCaseSource(typeof(DateValuesTest), "DateValuesData")]
    public bool MonthIsDecember(DateTime date)
    {
        var month = date.Month;
        if (month == 12)
            return true;
        else
            return false;
    }

    private static IEnumerable DateValuesData()
    {
        yield return new TestCaseData(new DateTime(2010, 12, 5)).Returns(true);
        yield return new TestCaseData(new DateTime(2010, 12, 1)).Returns(true);
        yield return new TestCaseData(new DateTime(2010, 01, 01)).Returns(false);
        yield return new TestCaseData(new DateTime(2010, 11, 01)).Returns(false);
    }
}
15 голосов
/ 04 апреля 2011

Просто передайте даты как строковые константы и проанализируйте их в своем тесте.Немного раздражает, но это всего лишь тест, так что не волнуйтесь слишком сильно.

[TestCase("1/1/2010")]
public void mytest(string dateInputAsString)
{
  DateTime dateInput= DateTime.Parse(dateInputAsString);
  ...
}
3 голосов
/ 03 декабря 2010

Определите пользовательский атрибут, который принимает шесть параметров, а затем используйте его как

[Values(2010, 12, 1, 2010, 12, 3)]

и затем создайте необходимые экземпляры DateTime соответственно.

Или вы могли бы сделать

[Values("12/01/2010", "12/03/2010")]

, поскольку это может быть немного более читабельным и обслуживаемым.

Как говорится в сообщении об ошибке, значения атрибутов не могут быть непостоянными (они встроены в метаданные сборки). Вопреки видимости, new DateTime(2010, 12, 1) не является константным выражением.

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