Как установить DateTime как ValuesAttribute на unit test? - программирование
Подтвердить что ты не робот

Как установить DateTime как ValuesAttribute на unit test?

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

[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

4b9b3361

Ответ 1

Альтернатива вздутию вашего unit test, вы можете разгрузить создание 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);
    }
}

Ответ 2

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

[TestCase("1/1/2010")]
public void mytest(string dateInputAsString)
{
  DateTime dateInput= DateTime.Parse(dateInputAsString);
  ...
}

Ответ 3

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

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

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

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

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

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

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