2010-09-10 28 views
9

Así que tengo una clase que tiene este aspecto:Prueba de una clase con una dependencia clase estática/método

public class MyClassToTest() 
{ 
    MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
} 

y una clase estática que tiene este aspecto:

public static class MyStaticClass() 
{ 
    public static void DoSomethingThatIsBadForUnitTesting() 
    { 
     // Hit a database 
     // call services 
     // write to a file 
     // Other things bad for unit testing 
    } 
} 

(Obviamente, esto es un ejemplo simplificado)

Por lo tanto, sé que la segunda clase está condenada a la prueba unitaria, pero ¿hay alguna forma de desacoplar la clase MyClassToTest para que pueda probarla (SIN instantánea iating MyStaticClass). Básicamente, me gustaría que ignore esta llamada.

. Nota: Lamentablemente este es un proyecto Compact Framework, por lo que las herramientas como Moles y Typemock aislador no se pueden utilizar :(

+0

¿qué idioma? Puedo pensar en algunas cosas en Python, pero esto se parece a Java. – wheaties

+0

@wheaties - lo siento, debería haber dicho ... C# (Visual Studio 2008) – Vaccano

Respuesta

12

Definir una interfaz que hace lo mismo que DoSomethingThatIsBadForUnitTesting, por ejemplo:

public interface IAction { 
    public void DoSomething(); 
} 

(. Obviamente, en código real, que te escoge mejores nombres)

a continuación, se puede escribir un simple envoltorio para la clase para su uso en el código de producción:

public class Action : IAction { 
    public void DoSomething() { 
     MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
    } 
} 

En MyClassToTest, debe pasar una instancia de IAction a través de su constructor y llamar al método en esa instancia en lugar de la clase estática. En el código de producción, pase en la clase concreta Action para que el código se comporte como antes. En la prueba unitaria, se pasa un objeto simulado que implementa IAction, ya sea utilizando un marco simulado o haciendo rodar su propio simulacro.

+1

Oooooooh, buenas cosas. ¡Lo intento! – Vaccano

+0

+1 Buena respuesta. el OP dijo "SIN instanciar MyStaticClass" - y el punto es que necesita crear una instancia de ALGO para beneficiarse del enlace del método dinámico aquí. –

+2

+1, este es el primer paso para dejar de implementar llamadas estáticas con efectos secundarios o Singletons de acceso estático. Los objetos de adaptador pueden ayudarlo a obtener código existente con dependencias estáticas bajo prueba. En última instancia, apunte hacia sacar por completo las llamadas estáticas problemáticas. –

Cuestiones relacionadas