2010-09-10 20 views
9

Così ho una classe che assomiglia a questo:Testare una classe con una classe statica metodo/dipendenza

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

e una classe statica che assomiglia a questo:

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

(Ovviamente questo è un esempio dumbed down)

Quindi, so che la seconda classe è condannata quando si tratta di test delle unità, ma esiste un modo per sganciare la classe MyClassToTest in modo che possa verificarla (SENZA istante iating MyStaticClass). Fondamentalmente, vorrei che ignorasse questa chiamata.

Nota:. Purtroppo questo è un progetto Compact Framework, in modo da strumenti come talpe e Typemock Isolator non possono essere utilizzati :(

+0

quale lingua? Posso pensare ad alcune cose in Python ma questo sembra Java. – wheaties

+0

@wheaties - scusa avrei dovuto dire ... C# (Visual Studio 2008) – Vaccano

risposta

12

Definire un'interfaccia che fa la stessa cosa come DoSomethingThatIsBadForUnitTesting, per esempio:

public interface IAction { 
    public void DoSomething(); 
} 

(. Ovviamente, nel codice vero e proprio, che ci si sceglie i nomi migliori)

Quindi è possibile scrivere un semplice wrapper per la classe per l'uso nel codice di produzione:

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

In MyClassToTest, si passa un'istanza di IAction tramite il suo costruttore e si chiama il metodo su quell'istanza anziché la classe statica. Nel codice di produzione, si passa nella classe di calcestruzzo Action in modo che il codice si comporti come prima. Nel test unitario, si passa in un oggetto fittizio che implementa IAction, utilizzando un sistema di simulazione o il proprio simulato.

+1

Oooooooh, roba buona. Ci provo! – Vaccano

+0

+1 buona risposta. l'OP diceva "SENZA istanziare MyStaticClass" - e il punto è che è necessario creare un'istanza di QUALCOSA per poter trarre vantaggio dall'associazione dei metodi dinamici qui. –

+2

+1, questo è il primo passo verso l'impossibilità di implementare chiamate statiche con effetti collaterali o singleton ad accesso statico. Gli oggetti dell'adattatore possono aiutarti a ottenere il codice esistente con dipendenze statiche sotto test. In definitiva, mirare a eliminare completamente le chiamate statiche problematiche. –

Problemi correlati