2011-01-27 15 views
19

Me gustaría escribir una función invocable que acepte dos objetos, y compara más de 30 propiedades de esos objetos con los asertos. El problema es que esto debe hacerse para alrededor de 20 pruebas unitarias existentes y la mayoría de las pruebas futuras, y escribir las afirmaciones de más de 30 cada vez consume tanto tiempo como espacio.¿Es posible parametrizar una prueba de nunit?

Actualmente tengo una función de prueba no unitaria que compara los objetos, y devuelve una cadena con "pase" o un mensaje de falla, y usa una afirmación para validar eso en cada prueba de unidad. Sin embargo, es bastante desordenado y siento que estoy yendo en contra de los métodos adecuados de prueba de la unidad.

¿Hay alguna manera de realizar una función que sea invocable desde las pruebas internas de la unidad que utiliza afirmaciones para verificar las condiciones?

Respuesta

17

Para responder a la parte final, por supuesto puede tener Afirma dentro de otra función. Afirma trabajo mediante el aumento de excepciones que las capturas corredor de prueba, e interpreta como un fracaso, por lo que tener una prueba como tal no tendrán ningún problema:

public void CheckAsserts(string value) 
{ 
    Assert.IsNotNull(value); 
} 

[TestCase("yes!")] 
public void MyTest(string value) 
{ 
    CheckAsserts(value); 
} 
+0

Eso es exactamente lo que estaba tratando de hacer, pero con dos parámetros. Tuve la función como un caso de prueba que creo que fue mi problema. Gracias – NewNetProgrammer

4

Sí, las pruebas unitarias son como cualquier otro código.

En particular, consulte NUnit.TestCaseAttribute.

+0

Había investigado eso, pero no podía ver cómo configurar los parámetros dinámicos. Quería comparar más de 20 objetos poblados manualmente con objetos poblados automáticamente de la base de datos. Crear una función vacía con afirmaciones (no un caso de prueba) y llamar a eso desde las pruebas de mi unidad funcionó perfectamente. Gracias – NewNetProgrammer

32

Si está utilizando NUnit 2.5.5 o superior, esto es posible utilizando el atributo TestCase.

pruebas unitarias normal sería decoradas con [Test], pero que pueden sustituir a la de la siguiente manera:

[TestCase("0", 1)] 
[TestCase("1", 1)] 
[TestCase("2", 1)] 
public void UnitTestName(string input, int expected) 
{ 
    //Arrange 

    //Act 

    //Assert 
} 

Ese tipo de cosas será la manera de hacerlo - obviamente tomar diferentes parametros.

Mira esta ayuda: http://nunit.org/?p=testCase&r=2.5

+0

El problema es que mis casos de prueba no son estáticos. Tengo un objeto poblado manualmente, y uno poblado de la base de datos que quiero comparar. – NewNetProgrammer

+0

'expected' debería ser más bien un tipo de retorno parametrizado de prueba, y debería proporcionar casos de prueba con valores devueltos en lugar de parámetros. –

0

Usted necesitará el atributo TestCase:

[TestCase("string1",...) 
public void test_UnitTest(string Parameter) 
{ 
    ... 
    Assert.AreEqual(Parameter, result) 
} 

Tenga en cuenta que esto sólo funciona con los tipos de datos primitivos como cadenas y enteros - no se puede crear una instancia de su propia clase y usarlo como un parámetro.

+0

El problema es que estoy usando mi propio objeto de clase con más de 30 atributos que quiero comparar. – NewNetProgrammer

1

Usted puede utilizar el atributo TestCase:

[TestCase("hostname1parameter")] 
[TestCase("hostname2parameter")] 
public void Example_TestHostName(string hostname) 
{ 
    ... 
} 
0

También puede beneficiarse del uso de C# introspección. Esto le permite obtener los nombres de los campos sin especificarlos en el código. Luego puede invocarlos por su nombre.

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

Esto le permite escribir ciertos tipos de pruebas que se aplicarán a las clases que aún no ha escrito.

Cuestiones relacionadas