Nunit使用datetime参数化测试

时间:2011-08-18 21:54:55

标签: unit-testing nunit

有人能告诉我,nunit是不可能的:

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

我真的想在那里放一个datetime,但它似乎不喜欢它。错误是:

  

属性参数必须是常量表达式,typeof表达式   或属性参数类型

的数组创建表达式

我读过的一些文档似乎暗示你应该能够但我找不到任何例子。

6 个答案:

答案 0 :(得分:113)

这是一个迟到的回答,但希望有价值。

您可以在TestCase属性中将日期指定为常量字符串,然后在方法签名中将类型指定为DateTime

NUnit将自动对传入的字符串执行DateTime.Parse()

示例:

[TestCase("01/20/2012")]
public void TestDate(DateTime dt)
{
    Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20)));
}

答案 1 :(得分:39)

我可能会使用类似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)
{
}

这将为_testData集合

中的每个条目运行TestMethod

答案 2 :(得分:7)

您应该使用记录的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 :(得分:7)

另一种选择是使用更详细的方法。特别是如果我不必事先知道,给定的字符串输入会产生什么样的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);
    ....
} 

...注意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)
{
....
}

答案 4 :(得分:3)

似乎NUnit不允许在TestCase中初始化非原始对象。最好使用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.
}

答案 5 :(得分:1)

Nunit 已经改进并隐式地尝试转换属性参数。 请参阅文档:NUnit3 Doc - see note

这有效:

[TestCase("2021.2.1", ExpectedResult = false)]
[TestCase("2021.2.26", ExpectedResult = true)]
public bool IsDate(DateTime date) => date.Date.Equals(new DateTime(2021, 2, 26));

注意对 DateTime 字符串参数使用英语区域性格式。