Nunit使用datetime参数化测试

Ano*_*use 57 nunit unit-testing

有人能告诉我,nunit不可能去:

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

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

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

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

Ron*_*ack 119

这是一个迟到的答案,但希望有价值.

您可以在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)));
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎只在使用斜杠时才使用美式格式.如果像我一样,你居住在美国境外,你可以使用这种格式"2014-12-25" (22认同)
  • 这很棒。似乎不适用于`DateTime?`,但是!? (2认同)
  • @PaulKertscher 时间已经过去了......它也适用于“DateTime?”参数。至少对于 Nunit 3.12.0 (2认同)

Sha*_*lde 43

我可能会使用像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)
{
}
Run Code Online (Sandbox Code Playgroud)

这将为_testData集合中的每个条目运行TestMethod

  • 这是一个很好的答案,效果很好.然而,它现在是2018年,对于刚刚陷入困境的开发人员,应该注意使用nameof()比字符串文字更可取.所以你只需要:[ValueSource(nameof(_testData))] TestData testData (4认同)

Caa*_*ad9 8

另一种选择是使用更冗长的方法.特别是如果我不一定知道前面,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);
    ....
} 
Run Code Online (Sandbox Code Playgroud)

...注意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)
{
....
}
Run Code Online (Sandbox Code Playgroud)


Dog*_*uca 7

您应该使用记录的TestCaseData类:http://www.nunit.org/index.php?p = testCaseSource&r = 2.5.9

除了指定预期结果外,例如:

 new TestCaseData( 12, 4 ).Returns( 3 );
Run Code Online (Sandbox Code Playgroud)

您还可以指定预期的例外等:

 new TestCaseData( 0, 0 )
    .Throws(typeof(DivideByZeroException))
    .SetName("DivideByZero")
    .SetDescription("An exception is expected");
Run Code Online (Sandbox Code Playgroud)