Как установить 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
Ответы
Ответ 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)
не является постоянным выражением.