Nunit параметризованные тесты с datetime
Может ли кто-нибудь сказать мне, что с nunit невозможно:
[TestCase(new DateTime(2010,7,8), true)]
public void My Test(DateTime startdate, bool expectedResult)
{
...
}
Я действительно хочу разместить datetime
там, но мне это не похоже. Ошибка:
Аргумент атрибута должен быть константным выражением, typeof expression или выражение создания массива типа параметра атрибута
Некоторая документация, которую я читаю, кажется, предполагает, что вы должны быть в состоянии, но я не могу найти никаких примеров.
Ответы
Ответ 1
Я бы, вероятно, использовал что-то вроде атрибута ValueSource, чтобы сделать это
public class TestData
{
public DateTime StartDate{ get; set; }
public bool ExpectedResult{ get; set; }
}
private static TestData[] _testData = new[]{
new TestData(){StartDate= new DateTime(2010,7,8), ExpectedResult= true}};
[Test]
public void TestMethod([ValueSource("_testData")]TestData testData)
{
}
Это запустит TestMethod для каждой записи в коллекции _testData
Ответ 2
Это немного запоздалый ответ, но, надеюсь, он имеет ценность.
Вы можете указать дату в виде постоянной строки в атрибуте TestCase
, а затем указать тип как DateTime
в сигнатуре метода.
NUnit автоматически выполнит DateTime.Parse()
для переданной строки.
Пример:
[TestCase("01/20/2012")]
[TestCase("2012-1-20")] //same case as above in ISO format
public void TestDate(DateTime dt)
{
Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20)));
}
Ответ 3
Вы должны использовать класс TestCaseData, как описано: http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9
Помимо указания ожидаемого результата, например:
new TestCaseData( 12, 4 ).Returns( 3 );
Вы также можете указать ожидаемые исключения и т.д.:
new TestCaseData( 0, 0 )
.Throws(typeof(DivideByZeroException))
.SetName("DivideByZero")
.SetDescription("An exception is expected");
Ответ 4
Другой альтернативой является использование более подробного подхода. Особенно, если я не обязательно знаю, какой тип DateTime()
(если есть...) дает заданный ввод строки.
[TestCase(2015, 2, 23)]
[TestCase(2015, 12, 3)]
public void ShouldCheckSomething(int year, int month, int day)
{
var theDate = new DateTime(year,month,day);
....
}
... note. TestCase поддерживает max 3 params, поэтому вам нужно больше, подумайте над чем-то вроде:
private readonly object[] testCaseInput =
{
new object[] { 2000, 1, 1, true, "first", true },
new object[] { 2000, 1, 1, false, "second", false }
}
[Test, TestCaseSource("testCaseInput")]
public void Should_check_stuff(int y, int m, int d, bool condition, string theString, bool result)
{
....
}
Ответ 5
Кажется, что NUnit не разрешает инициализацию не-примитивных объектов в TestCase (s). Лучше всего использовать TestCaseData.
Класс тестовых данных будет выглядеть следующим образом:
public class DateTimeTestData
{
public static IEnumerable GetDateTimeTestData()
{
// If you want past days.
yield return new TestCaseData(DateTime.Now.AddDays(-1)).Returns(false);
// If you want current time.
yield return new TestCaseData(DateTime.Now).Returns(true);
// If you want future days.
yield return new TestCaseData(DateTime.Now.AddDays(1)).Returns(true);
}
}
В вашем классе тестирования у вас будет тест TestCaseSource, который направляет ваши тестовые данные.
Как использовать: TestCaseSource (typeof (имя класса идет здесь), nameof (имя свойства идет здесь))
[Test, TestCaseSource(typeof(DateTimeTestData), nameof(GetDateTimeTestData))]
public bool GetDateTime_GivenDateTime_ReturnsBoolean()
{
// Arrange - Done in your TestCaseSource
// Act
// Method name goes here.
// Assert
// You just return the result of the method as this test uses ExpectedResult.
}