Search code examples
c#tddnunittestcase

How do I put new List<int> {1} in an NUNIT TestCase?


I have the method:

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();
    }

Here is my test against it, but it does not like new List<int> {1} in the 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);
    }

It gives me the error:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

Do I have to do it like this:

    [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);
    }

Solution

  • There is one option to use TestCaseSource attribute. Here I provide a non-assert test with two cases just to see how it works:

    [TestFixture]
    public class TestClass
    {
        private static readonly object[] _sourceLists = 
        {
            new object[] {new List<int> {1}},   //case 1
            new object[] {new List<int> {1, 2}} //case 2
        };
    
        [TestCaseSource(nameof(_sourceLists))]
        public void Test(List<int> list)
        {
            foreach (var item in list)
                Console.WriteLine(item);
        }
    }
    

    Anyhow I have to mention it is not the most evident solution and I would prefer neatly organized fixtures ignoring the fact they are more verbose

    More information: https://github.com/nunit/docs/wiki/TestCaseSource-Attribute