xaisoft xaisoft - 3 months ago 22
C# Question

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

Answer

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

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