xai*_*oft 30 c# tdd nunit testcase
我有方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
这是我对它的测试,但它new List<int> {1}在TestCase 中不喜欢:
[TestCase(new List<int>{1}, 1)]
public void Add_WithOneNumber_ReturnsNumber(List<int> numbers)
{
var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);
Assert.AreEqual(1, result);
}
Run Code Online (Sandbox Code Playgroud)
它给了我错误:
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);
}
Run Code Online (Sandbox Code Playgroud)
Yur*_*han 43
有一个选项可以使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我不得不提到它不是最明显的解决方案,我宁愿整齐有组织的灯具忽略了它们更详细的事实
Jai*_*der 20
我的解决方案更简单,我只是使用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);
}
Run Code Online (Sandbox Code Playgroud)
小智 10
你可以使用这个:
[TestCase(new []{1,2,3})]
public void Add_WithOneNumber_ReturnsNumber(int[] numbers)
Run Code Online (Sandbox Code Playgroud)
改进@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))]
Run Code Online (Sandbox Code Playgroud)
希望这有帮助。
我经常使用字符串和解析,因为它在testrunner中很好地呈现。样品:
[TestCase("1, 2")]
[TestCase("1, 2, 3")]
public void WithStrings(string listString)
{
var list = listString.Split(',')
.Select(int.Parse)
.ToList();
...
}
Run Code Online (Sandbox Code Playgroud)
在Resharper的跑步者中看起来像这样:
使用数组作为new [] {1, 2}测试用例的参数,并将其转换为测试方法中的列表numbers.ToList()。
using System.Linq
...
[TestCase(new [] {1}, 1)]
[TestCase(new [] {1, 2}, 3)]
[TestCase(new [] {1, 2, 3}, 6)]
public void Return_sum_of_numbers(int[] numbers, int expectedSum)
{
var sum = CalculatorLibrary.CalculatorFunctions.Add(numbers.ToList());
Assert.AreEqual(expectedSum, sum );
// much cooler with FluentAssertions nuget:
// sum.Should.Be(expectedSum);
}
Run Code Online (Sandbox Code Playgroud)