2012-01-13 22 views
9

¿Cómo puedo simular que se lanza una excepción en las pruebas de unidad C#?¿Cómo simular lanzando una excepción en las pruebas unitarias?

Quiero poder tener el 100% de cobertura de mi código, pero no puedo probar el código con excepciones que puedan ocurrir. Por ejemplo, no puedo simular una faluire de poder que pueda ocurrir.

Por ejemplo:

public void MyMethod() 
{ 
    try 
    { 
    ... 
    } 
    catch(OutOfMemoryException e) 
    { 
    ... 
    } 
    catch(RandomErrorFromDatabaseLayer e) 
    { 
    ... 
    } 
} 

Quiero ser capaz de simular cualquier tipo de excepción que es en este método y debe ser capturado.
¿Hay alguna biblioteca que pueda ayudarme en este asunto?

Edit 1: ¿Alguna ayuda para lograr lo que solicité con Moq?

+1

Su ejemplo de código no explica su problema. ¿Por qué no puedes simular una falla de energía? ¿Estás tratando de 'inyectar' condiciones que podrían provocar el lanzamiento de las excepciones mencionadas? ¿Cuál es el verdadero problema? –

+0

sí, al igual que en http://stackoverflow.com/a/8851628/79379, pero sin que yo destruya una base de datos para simular una base de datos faluire. –

Respuesta

8

Necesita crear un objeto simulado que representa los objetos reales que pueden arrojar estas excepciones. A continuación, puede crear pruebas de que simplemente son algo como esto:

public void ExampleMethod() 
{ 
    throw new OutOfMemoryException(); 
} 

Si está utilizando un marco de inyección de dependencias que hace que la sustitución del código real con el código simulacro mucho más fácil.

5

Lo que necesita es stub - un objeto que simulará ciertas condiciones para su código. Para propósitos de prueba, generalmente reemplaza la implementación real de objetos con stub (u otro tipo de objeto falso). En su caso, tener en cuenta:

public class MyClass 
{ 
    private IDataProvider dataProvider; 

    public void MyMethod() 
    { 
     try 
     { 
      this.dataProvider.GetData(); 
     } 
     catch (OutOfMemoryException) 
     { 
     } 
    } 
} 

Ahora, la clase que se está probando debe ser configurable en algún nivel - por lo que se puede reemplazar fácilmente verdadera DataProvider aplicación con aplastó/fingido uno al probar (como usted ha dicho, usted don' ¡Quiero destruir tu base de datos, nadie quiere!). Esto se puede lograr, por ejemplo, mediante inyección de constructor (o de hecho, cualquier otra técnica de dependency injection).

Su prueba entonces es trivial (algún requisito maquillada a prueba cuando se lanza una excepción):

[Test] 
public void MyMethod_DataProviderThrowsOutOfMemoryException_LogsError() 
{ 
    var dataProviderMock = new Mock<IDataProvider>(); 
    dataProviderMock 
     .Setup(dp => dp.GetData()) 
     .Throws<OutOfMemoryException>(); 
    var myClass = new MyClass(dataProviderMock); 

    myClass.MyMethod(); 

    // assert whatever needs to be checked 
} 
Cuestiones relacionadas