web-dev-qa-db-fra.com

Comment mettre une nouvelle liste <int> {1} dans une NUNIT TestCase?

J'ai la méthode:

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

Voici mon test contre, mais il n'aime pas new List<int> {1} dans le 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);
    }

Cela me donne l'erreur:

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

Dois-je le faire comme ceci:

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

Il existe une option pour utiliser l'attribut TestCaseSource. Ici, je fournis un test non assert avec deux cas juste pour voir comment cela fonctionne:

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

Quoi qu'il en soit, je dois mentionner que ce n'est pas la solution la plus évidente et je préférerais des luminaires soigneusement organisés en ignorant le fait qu'ils sont plus verbeux

43
Yurii Hohan

Ma solution est plus simple, j'utilise simplement params. J'espère que cela fonctionne pour vous!

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

J'utilise souvent des chaînes de caractères et l'analyse syntaxique car elles s'affichent bien dans le testrunner. Échantillon:

[TestCase("1, 2")]
[TestCase("1, 2, 3")]
public void WithStrings(string listString)
{
    var list = listString.Split(',')
                         .Select(int.Parse)
                         .ToList();
    ...
}

Ressemble à ceci dans le coureur de Resharper:

enter image description here

5
Johan Larsson

Améliorez le code de la réponse @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))]

J'espère que cette aide.

3
zquanghoangz

utilisez array comme paramètre new [] {1, 2} pour les cas de test et convertissez-le en List dans la méthode de test 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);
}
1
Blechdose

Vous pouvez utiliser ceci:

[TestCase (nouveau [] {1,2,3})]

public void Add_WithOneNumber_ReturnsNumber (nombres int [])

1
jecaestevez