visual unit test studio setup net mock ejemplo c# tdd nunit testcase

c# - studio - ¿Cómo coloco la nueva Lista<int>{1} en un NUNIT TestCase?



nunit visual studio 2017 (7)

A menudo utilizo cadenas y análisis, ya que se reproduce bien en el testrunner. Muestra:

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

Se parece a esto en el corredor de Resharper:

Tengo el método:

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

Aquí está mi prueba, pero no le gusta la new List<int> {1} en el 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); }

Me da el error:

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

¿Tengo que hacerlo así?

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


Hay una opción para usar el atributo TestCaseSource . Aquí proporciono una prueba de no evaluación con dos casos solo para ver cómo funciona:

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

De todos modos, debo mencionar que no es la solución más evidente y preferiría que los accesorios estén bien organizados, ignorando el hecho de que son más detallados.


Mejorar el código para la respuesta de @Yurii Hohan:

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

Espero que esto ayude.


Mi solución es más simple, solo uso params . ¡Espero que esto funcione para ti!

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


No puede usar objetos solo constantes de tiempo de compilación en atributos de datos. Para evitar el uso de la reflexión, que es extremadamente ilegible y no del todo adecuada para una prueba que pretende describir formalmente el comportamiento lo más claramente posible, esto es lo que hago:

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

Es un par de líneas más, pero eso es solo porque quiero resultados de prueba claros. Usted podría simplemente ponerlos en una [Prueba] si está buscando algo más conciso.


Puedes usar esto:

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

public void Add_WithOneNumber_ReturnsNumber (int [] numbers)


Simplemente cree la lista dentro del método, así:

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