使用' TestCase'具有二维数组的属性

时间:2015-04-18 18:51:37

标签: c# arrays nunit testcaseattribute

我正在使用NUnit并尝试为以下方法实现测试: 它应该接受两个整数并返回二维数组。 所以,我测试的标题看起来像:

[TestCase(5, 1, new int[,]{{1}, {2}, {3}, {4}, {5}})]
public void MyTestMethod(int a, int b, int[][] r)

在编译期间,我遇到以下错误:

  

错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式(CS0182)


我知道可以使用TestCaseSource来引用对象数组,例如以下问题的答案:

代码如下:

private object[][] combination_tests =  new [] {
    new object[] {5, 1, new [,]{{1}, {2}, {3}, {4}, {5}}},
};

[Test]
[TestCaseSource("combination_tests")]
public void MyTestMethod(int a, int b, int[,] r)

但我仍然有一个问题:仅使用TestCase属性是否可以做到这一点?

2 个答案:

答案 0 :(得分:5)

绝对是否需要为您的方法设置相同的签名,即

public void MyTestMethod(int a, int b, int[][] r)
{
    // elided
}

根据您的具体情况,您有两种选择,两种选项都使用您在问题中所说的[TestCase]属性:

  

是否可以仅使用TestCase属性?

我更喜欢第一种选择,因为它感觉更简洁,但两者都符合您的需求。


选项1:如果没有必要保持相同的签名

你可以稍微修改签名,这样你就可以传入一个字符串(which is compile-time constant)来代替数组(而不是编译时常量),这可以用于获取数组,例如

private static int[][] getArrayForMyTestMethod(string key)
{
    // logic to get from key to int[][]
}

[TestCase(5, 1, "dataset1")]
public void MyTestMethod(int a, int b, string rKey)
{
    int[][] r = getArrayForMyTestMethod(rKey);
    // elided
}

选项2:如果需要保留相同的签名

如果需要为方法保留相同的签名,则可以使用与选项1相同的包装方法,即

private static int[][] getArrayForMyTestMethod(string key)
{
    // logic to get from key to int[][]
}

[TestCase(5, 1, "dataset1")]
public void MyTestMethodWrapper(int a, int b, string rKey)
{
    int[][] r = getArrayForMyTestMethod(rKey);
    MyTestMethod(a, b, r);
}

public void MyTestMethod(int a, int b, int[][] r)
{
    // elided
}

显然你可以使用任何可以编译时常量而不是string的类型,具体取决于你构建测试用例的方式,但我建议使用string因为你能够以这种方式在NUnit运行程序中为您的测试用例提供名称


否则您的替代方法是使用您在问题中提到的[TestCaseSource]

答案 1 :(得分:4)

您可以使用testcasedata对象传递结果

    public IEnumerable<TestCaseData> combination_tests()
        {
          yield return new TestCaseData(5,1,new int[,] {{1}, {2}, {3}, {4}, {5}});
        }

    [Test]
    [TestCaseSource("combination_tests")]
    public void test(int a, int b, int[,] r)
        {

            Console.WriteLine(r[0,0] & r[1,0]);

        }

您还可以使用.SetName(&#34; xxx&#34;)或.SetCategory(&#34; xxx&#34;)为每个testCaseData项设置测试类别和测试名称,这对于组织测试