Nunit параметризованные тесты с datetime - программирование
Подтвердить что ты не робот

Nunit параметризованные тесты с datetime

Может ли кто-нибудь сказать мне, что с nunit невозможно:

[TestCase(new DateTime(2010,7,8), true)]
public void My Test(DateTime startdate, bool expectedResult)
{
    ...
}

Я действительно хочу разместить datetime там, но мне это не похоже. Ошибка:

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

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

4b9b3361

Ответ 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.
}