Nunit параметризованные тесты с датой и временем - PullRequest
53 голосов
/ 19 августа 2011

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

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

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

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

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

Ответы [ 5 ]

113 голосов
/ 16 мая 2013

Это немного запоздалый ответ, но, надеюсь, его значение.

Вы можете указать дату в виде постоянной строки в атрибуте TestCase, а затем указать тип как DateTime в сигнатуре метода..

NUnit автоматически сделает DateTime.Parse() на переданной строке.

Пример:

[TestCase("01/20/2012")]
public void TestDate(DateTime dt)
{
    Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20)));
}
40 голосов
/ 19 августа 2011

Я бы, вероятно, использовал что-то вроде атрибута 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

7 голосов
/ 03 февраля 2016

Другой альтернативой является использование более подробного подхода. Особенно, если я не обязательно заранее знаю, какой тип 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 поддерживает максимум 3 параметра, поэтому вам нужно больше, рассмотрите что-то вроде:

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)
{
....
}
7 голосов
/ 05 ноября 2012

Вы должны использовать класс 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");
3 голосов
/ 19 апреля 2017

Кажется, что 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...