我有方法:
public static int Add(List<int> numbers)
{
if (numbers == null || numbers.Count == 0)
return 0;
if (numbers.Count == 1)
return numbers[0];
throw new NotImplementedException();
}
这是我对它的测试,但它不喜欢TestCase中的new List<int> {1}
:
[TestCase(new List<int>{1}, 1)]
public void Add_WithOneNumber_ReturnsNumber(List<int> numbers)
{
var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);
Assert.AreEqual(1, result);
}
它给了我错误:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我必须这样做:
[Test]
public void Add_WithOneNumber_ReturnsNumber()
{
var result = CalculatorLibrary.CalculatorFunctions.Add(new List<int>{7});
Assert.AreEqual(7, result);
var result2 = CalculatorLibrary.CalculatorFunctions.Add(new List<int> {3});
Assert.AreEqual(4,result2);
}
有一个选项可以使用TestCaseSource属性。在这里,我提供了两个案例的非断言测试,以了解它是如何工作的:
[TestFixture]
public class TestClass
{
private object[] _sourceLists = {new object[] {new List<int> {1}}, //case 1
new object[] {new List<int> {1, 2}} //case 2
};
[Test, TestCaseSource("_sourceLists")]
public void Test(List<int> list)
{
foreach (var item in list)
Console.WriteLine(item);
}
}
无论如何,我不得不提到它不是最明显的解决方案,我宁愿整齐有组织的灯具忽略了它们更详细的事实
我的解决方案更简单,我只使用params
。我希望这对你有用!
[TestCase(1, 1)]
[TestCase(10, 5, 1, 4)]
[TestCase(25, 3, 5, 5, 12)]
public void Linq_Add_ShouldSumAllTheNumbers(int expected, params int[] numbers)
{
var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);
Assert.AreEqual(expected, result);
}
改进@Yurii Hohan的代码答案:
private static readonly object[] _Data =
{
new object[] {new List<int> {0}, "test"},
new object[] {new List<int> {0, 5}, "test this"},
};
[Test, TestCaseSource(nameof(_Data))]
希望这有帮助。
你可以用这个:
[TestCase(new [] {1,2,3})]
public void Add_WithOneNumber_ReturnsNumber(int [] numbers)
使用数组作为参数new [] {1}
并将其转换为测试方法result.ToList()
中的List。这需要using System.Linq;
。
[TestCase(new [] {1}, 1)]
[TestCase(new [] {2}, 2)]
[TestCase(new [] {1000}, 1000)]
public void Add_WithOneNumber_ReturnsNumber(int[] numbers)
{
var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);
Assert.AreEqual(1, result.ToList());
}
您不能仅在数据属性中使用对象编译时常量。为了避免使用反射,我觉得这是非常难以理解的,并且根本不适合用于尽可能清楚地正式描述行为的测试,这就是我所做的:
[Test]
public void Test_Case_One()
{
AssertCurrency(INPUT, EXPECTED);
}
[Test]
public void Test_Case_Two()
{
AssertCurrency(INPUT, EXPECTED);
}
private void AssertScenario(int input, int expected)
{
Assert.AreEqual(expected, input);
}
这是几行,但这只是因为我想要清晰的测试输出。如果您正在寻找更简洁的东西,您可以轻松地将它们放在一个[测试]中。
只需在方法内创建列表,如下所示:
public void Add_WithOneNumber_ReturnsNumber()
{
var result = CalculatorLibrary.CalculatorFunctions.Add(new List<int>{1});
Assert.AreEqual(1, result);
}