DataTestMethods 的非编译时间常量
Non-compile time constants for DataTestMethods
如何将 [DataTestMethod]
与 [DataRow(...)]
与非编译时常量结合使用?示例:
[DataTestMethod]
[DataRow(new DateTime(2000, 1, 1), "2000-01-01")]
[DataRow(new DateTime(2000, 2, 1), "2000-02-01")]
public void TestTime(DateTime dateTime, string expected) {
Assert.AreEqual(dateTime.ToString("yyyy-MM-dd"), expected);
Assert.AreEqual(dateTime.ToString("yyyy-MM-dd"), expected);
}
这将在 new DateTime(...)
上引发编译错误,因为这不是编译时常量。
很明显,您是在让方法在编译后一次创建日期,而库不允许您这样做。
您有两个解决方案:
- 传递一个字符串然后在方法中处理它。
- 传递单独的整数(日、月、年等)并在方法内处理它们。
您只能在属性中指定编译时常量,因此您不能像 DataRow
那样直接向测试方法提供非常量数据。但是,您可以使用可以指定方法的 DynamicData 属性或可以检索非常量数据的 属性。
例如;
[DynamicData(nameof(GetTestData), DynamicDataSourceType.Method)]
[DataTestMethod]
public void TestFoo_Bar_ReturnsExpected(decimal x, decimal y, decimal expectedResult)
{
var foo = new Foo();
var outcome = foo.Bar(x, y);
Assert.AreEqual(expectedResult, outcome);
}
public static IEnumerable<object[]> GetTestData()
{
yield return new object[] { 0M, 5M, 0M };
yield return new object[] { 5M, 5M, 25M };
}
如何将 [DataTestMethod]
与 [DataRow(...)]
与非编译时常量结合使用?示例:
[DataTestMethod]
[DataRow(new DateTime(2000, 1, 1), "2000-01-01")]
[DataRow(new DateTime(2000, 2, 1), "2000-02-01")]
public void TestTime(DateTime dateTime, string expected) {
Assert.AreEqual(dateTime.ToString("yyyy-MM-dd"), expected);
Assert.AreEqual(dateTime.ToString("yyyy-MM-dd"), expected);
}
这将在 new DateTime(...)
上引发编译错误,因为这不是编译时常量。
很明显,您是在让方法在编译后一次创建日期,而库不允许您这样做。
您有两个解决方案:
- 传递一个字符串然后在方法中处理它。
- 传递单独的整数(日、月、年等)并在方法内处理它们。
您只能在属性中指定编译时常量,因此您不能像 DataRow
那样直接向测试方法提供非常量数据。但是,您可以使用可以指定方法的 DynamicData 属性或可以检索非常量数据的 属性。
例如;
[DynamicData(nameof(GetTestData), DynamicDataSourceType.Method)]
[DataTestMethod]
public void TestFoo_Bar_ReturnsExpected(decimal x, decimal y, decimal expectedResult)
{
var foo = new Foo();
var outcome = foo.Bar(x, y);
Assert.AreEqual(expectedResult, outcome);
}
public static IEnumerable<object[]> GetTestData()
{
yield return new object[] { 0M, 5M, 0M };
yield return new object[] { 5M, 5M, 25M };
}