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属性是否可以做到这一点?
是否绝对需要为您的方法使用相同的签名,即
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")这对于组织测试很有帮助。
| 归档时间: |
|
| 查看次数: |
2109 次 |
| 最近记录: |