DataTestMethods的非编译时间常量

时间:2017-09-01 09:59:33

标签: c# unit-testing mstest

如何将[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(...)上抛出编译错误,因为这不是编译时常量。

2 个答案:

答案 0 :(得分:2)

您只能在属性中指定编译时常量,因此无法使用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 };
}

答案 1 :(得分:0)

嗯,你显然是让这个方法在编译后一次创建日期,并且库不允许你这样做。

您有两个解决方案

  1. 传递字符串,然后在方法内处理。
  2. 传递单独的整数(日,月,年等)并在方法内处理它们。