有人能告诉我,nunit是不可能的:
[TestCase(new DateTime(2010,7,8), true)]
public void My Test(DateTime startdate, bool expectedResult)
{
...
}
我真的想在那里放一个datetime
,但它似乎不喜欢它。错误是:
属性参数必须是常量表达式,typeof表达式 或属性参数类型
的数组创建表达式
我读过的一些文档似乎暗示你应该能够但我找不到任何例子。
答案 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 字符串参数使用英语区域性格式。