Come inserisco la nuova lista {1} in una NUNIT TestCase?

Ho il metodo:

public static int Add(List numbers) { if (numbers == null || numbers.Count == 0) return 0; if (numbers.Count == 1) return numbers[0]; throw new NotImplementedException(); } 

Ecco il mio test, ma non mi piace la new List {1} nel TestCase:

  [TestCase(new List{1}, 1)] public void Add_WithOneNumber_ReturnsNumber(List numbers) { var result = CalculatorLibrary.CalculatorFunctions.Add(numbers); Assert.AreEqual(1, result); } 

Mi dà l’errore:

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

Devo farlo in questo modo:

  [Test] public void Add_WithOneNumber_ReturnsNumber() { var result = CalculatorLibrary.CalculatorFunctions.Add(new List{7}); Assert.AreEqual(7, result); var result2 = CalculatorLibrary.CalculatorFunctions.Add(new List {3}); Assert.AreEqual(4,result2); } 

    C’è un’opzione per utilizzare l’ attributo TestCaseSource . Qui fornisco un test non-assert con due casi solo per vedere come funziona:

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

    In ogni caso, devo menzionare che non è la soluzione più evidente e preferirei i proiettori ordinatamente organizzati ignorando il fatto che sono più prolissi

    La mia soluzione è più semplice, uso solo params . Spero che questo funzioni per te!

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

    Uso spesso le stringhe e il parsing mentre si presenta bene nel testrunner. Campione:

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

    Sembra questo nel corridore di Resharper:

    inserisci la descrizione dell'immagine qui

    Migliora il codice per la risposta @Yurii Hohan:

     private static readonly object[] _Data = { new object[] {new List {0}, "test"}, new object[] {new List {0, 5}, "test this"}, }; [Test, TestCaseSource(nameof(_Data))] 

    Spero che questo aiuto.

    Puoi usare questo:

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

    vuoto pubblico Add_WithOneNumber_ReturnsNumber (int [] numeri)

    Non è ansible utilizzare gli oggetti solo le costanti in fase di compilazione negli attributi dei dati. Per evitare l’uso del riflesso, che trovo estremamente illeggibile e non del tutto appropriato per un test che intende descrivere formalmente il comportamento nel modo più chiaro ansible, ecco cosa faccio:

      [Test] public void Test_Case_One() { AssertCurrency(INPUT, EXPECTED); } [Test] public void Test_Case_Two() { AssertCurrency(INPUT, EXPECTED); } private void AssertScenario(int input, int expected) { Assert.AreEqual(expected, input); } 

    Sono poche altre righe, ma è solo perché voglio un chiaro output di test. Potresti semplicemente metterli in una [Prova] se stai cercando qualcosa di più conciso.

    Basta invece creare la lista all’interno del metodo, in questo modo:

     public void Add_WithOneNumber_ReturnsNumber() { var result = CalculatorLibrary.CalculatorFunctions.Add(new List{1}); Assert.AreEqual(1, result); }