2010-06-10 7 views
11

Quiero probar un método que tiene una alta complejidad ciclomática (suspiro) y me gustaría tener una clase dentro de la clase de prueba para que una clase de prueba de método aparezca como un nodo en el árbol. ¿Es posible con Nunit y cómo?Nunidad: ¿Es posible que las pruebas aparezcan anidadas

MyEntityTests 
| 
L_ MyComplexMethodTests 
    L when_some_condition_than 
    L when_some_other_condition_than 

[TestFixture] 
public class MyEntityTests 
{ 
    [TestFixture] 
    public class MyComplexMethodTests 
    { 
    [Test] 
    public void when_some_condition_than() {} 
    etc..... 

    } 
} 
+0

¿Qué estás tratando de lograr por los nidos de las pruebas? – Pedro

+0

¿No es obvio de la pregunta? – epitka

+0

¿Quiere realizar solo algunas pruebas pero no otras? ¿Estás necesitando esto solo para separarlos visualmente? – Pedro

Respuesta

17

Puede hacerlo con clases anidadas, muy similar al código de ejemplo en su pregunta.

La única diferencia para su código es que la clase externa no necesita el atributo [TestFixture] si solo se usa para la estructura y no tiene pruebas.

También puede tener todas las clases internas comparten un método Setup, poniéndolo en la clase exterior y que tiene las clases internas heredar de la clase externa:

using NUnit.Framework; 

namespace My.Namespace 
{ 
    public class MyEntityTests 
    { 
     [SetUp] 
     public void Setup() 
     { 
     } 

     [TestFixture] 
     public class MyComplexMethodTests : MyEntityTests 
     { 
      [Test] 
      public void when_some_condition_than() 
      { 
      } 

      [Test] 
      public void when_some_other_condition_then() 
      { 
      } 
     } 
    } 
} 

En la GUI NUnit, esta clase de prueba se tener este aspecto:

NUnit GUI

+3

El corredor de prueba de Resharper parece reconocer pero ignora cualquier prueba estructurada de esta manera. : \ –

+0

@JohnHoerr En versiones más recientes de ReSharper esto funciona. –

+0

¿Sabe si las clases internas pueden tener un método SetUp adicional? Entonces la configuración de toda la clase podría ocurrir para todos, y la configuración específica del método podría ocurrir dentro de la clase interna? No importa, encontré la respuesta aquí: https://stackoverflow.com/questions/17659213/nunit-and-setup-in-base-classes – IronSean

1

Parece que tiene una clase que desea probar, pero tiene dos conjuntos/tipos de pruebas para ejecutar. La forma más fácil de hacerlo podría ser crear dos TestFixtures, uno para cada uno. Otra forma de hacerlo es colocar cada prueba en una Categoría.

Editar: Si todas las pruebas están en el mismo método, una opción es usar el atributo TestCase y especificar los parámetros para cada prueba (así como el resultado esperado). La GUI anidará cada conjunto de parámetros de TestCase bajo una sola instancia de ese nombre de prueba. Esto supone que todas sus pruebas se comportarán de manera similar, es decir, las mismas aseveraciones básicas o ExpectedExceptions.

6

espacios de nombres que he usado para obtener este comportamiento (abusado?):

namespace MyEntityTests.MyComplexMethodTests 
{ 
    [TestFixture] 
    public class when_some_condition_than 
    { 
     [Test] 
     public void it_should_do_something() 
     {   
     } 
    } 

    [TestFixture] 
    public class when_some_other_condition_than 
    { 
     [Test] 
     public void it_should_do_something_else() 
     {   
     } 
    } 
} 

que le dará:

MyEntityTests 
- MyComplexMethodTests 
    - when_some_condition_than 
    - it_should_do_something 
    - when_some_other_condition_than 
    - it_should_do_something_else 

En este caso, normalmente voy a utilizar el TestFixture para definir el contexto para la prueba.

+0

+1 - Buena solución para mis necesidades actuales. – JOpuckman

Cuestiones relacionadas