如何将新的List <int> {1}放入NUNIT TestCase中?

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)

无论如何,我不得不提到它不是最明显的解决方案,我宁愿整齐有组织的灯具忽略了它们更详细的事实

  • 更新您的评论,使用:private static readonly object [] _Data = {new object [] {new List <int> {0},"test"},new object [] {new List <int> {0,5} ,"测试这个"},}; [Test,TestCaseSource(nameof(_Data))] (3认同)

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)

  • 这并不能回答问题。您正在使用不变的原语。除了编译时常量之外的任何东西都可以尝试。 (6认同)

小智 10

你可以使用这个:

[TestCase(new []{1,2,3})]
public void Add_WithOneNumber_ReturnsNumber(int[] numbers)
Run Code Online (Sandbox Code Playgroud)


zqu*_*ngz 9

改进@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)

希望这有帮助。


Joh*_*son 6

我经常使用字符串和解析,因为它在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的跑步者中看起来像这样:

在此处输入图片说明


Ble*_*ose 6

使用数组作为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)