Nunit使用datetime进行参数化testing

有人可以告诉我是不是可以与nunit去:

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

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

属性参数必须是常量expression式,typeofexpression式或属性参数types的数组创buildexpression式

我读的一些文件似乎build议你应该能够但我找不到任何例子。

我可能会使用像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

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

您可以在TestCase属性中将date指定为常量string,然后在方法签名中将types指定为DateTime

NUnit会自动对传入的string做一个DateTime.Parse()

例:

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

您应该按照logging使用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"); 

另一种select是使用更详细的方法。 特别是如果我不一定知道前面什么样的DateTime() (如果有的话)给定的stringinput产量。

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

看起来,NUnit不允许初始化TestCase中的非原始对象。 最好使用TestCaseData 。

您的testing数据类将如下所示:

 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); } } 

在你的testing类中,你会有testing包含一个TestCaseSource ,它指向你的testing数据。

如何使用: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. }