将"TestCase"属性与二维数组一起使用

mnl*_*tev 8 c# arrays nunit testcaseattribute

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

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

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

错误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)
Run Code Online (Sandbox Code Playgroud)

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

Wai*_*Lee 5

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

public void MyTestMethod(int a, int b, int[][] r)
{
    // elided
}
Run Code Online (Sandbox Code Playgroud)

根据您的情况,您有两个可用的选项,两个选项都使用[TestCase]您在问题中表示的属性:

仅使用TestCase属性可以做到这一点吗?

我更喜欢第一种选择,因为它感觉更简洁,但是两者都可以满足您的需求。


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

您可以稍微修改签名,以便传递一个字符串(它是编译时常量)而不是一个数组(不是编译时常量),例如,它可以用来获取数组。

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
}
Run Code Online (Sandbox Code Playgroud)

选项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
}
Run Code Online (Sandbox Code Playgroud)

显然,您可以使用可以是编译时常量的任何类型,而不必string取决于测试用例的构造方式,但是我建议使用a,string因为这样您就可以在NUnit运行器中为测试用例命名


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


小智 3

您可以使用该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]);
}
Run Code Online (Sandbox Code Playgroud)

.SetName("xxx")您还可以使用或为每个 testCaseData 项设置测试类别和测试名称,.SetCategory("xxx")这对于组织测试很有帮助。