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);
}
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
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);
}
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:
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.
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);
}
Vous pouvez utiliser ceci:
[TestCase (nouveau [] {1,2,3})]
public void Add_WithOneNumber_ReturnsNumber (nombres int [])