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