我正在使用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
属性是否可以做到这一点?
答案 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项设置测试类别和测试名称,这对于组织测试