2009-06-02 12 views
5

Come posso testare il seguente metodo?Come si esegue il test del codice dell'unità che crea un nuovo processo?

È un metodo su un'implementazione di classe concreta di un'interfaccia.

Ho imbustato la classe Process con un'interfaccia che espone solo i metodi e le proprietà di cui ho bisogno. La classe ProcessWrapper è l'implementazione concreta di questa interfaccia.

public void Initiate(IEnumerable<Cow> cows) 
    { 
     foreach (Cow c in cows) 
     { 
      c.Process = new ProcessWrapper(c); 
      c.Process.Start(); 
      count++; 
     } 
    } 

risposta

3

Ci sono due modi per aggirare questo. Il primo è usare l'iniezione di dipendenza. È possibile iniettare una fabbrica e chiamare Initiate il metodo di creazione per ottenere il tipo di ProcessWrapper necessario per il test.

L'altra soluzione è utilizzare un framework di simulazione come TypeMock, che consente di aggirare questo problema. TypeMock fondamentalmente ti permette di prendere in giro qualsiasi cosa, quindi potresti usarlo per fornire un oggetto fittizio invece delle istanze di ProcessWrapper.

+0

Sto usando Moq ma non sono sicuro di come lo deriderei. Come lo faresti in TypeMock? – Schotime

+0

TypeMock è unico in quanto modifica l'IL, che consente di simulare entità che altrimenti non potresti deridere. Consiglierei comunque l'approccio di iniezione prima, ma se questo non è possibile, potresti guardare a TypeMock. –

0

Che cosa fa il processo? C'è un modo per controllare che stia facendo quello che dovrebbe fare? Ad esempio, potrebbe scrivere su un file o una tabella di database. Oppure potrebbe esporre un'API (IPC, servizio Web, ecc.) Che potresti provare a chiamare con i dati di test.

Da un punto di vista TDD, potrebbe essere opportuno inserire un "processo di simulazione/test" che esegua alcune azioni che è possibile verificare facilmente. (Ciò potrebbe richiedere modifiche al codice per consentire al codice di test di iniettare qualcosa.) In questo modo, stai solo testando il codice di chiamata e non necessariamente testando un vero e proprio processo di business. Potresti quindi avere diversi test unitari per testare il tuo processo aziendale.

+0

Avvia un nuovo "Processo". – Schotime

+0

Intendo cosa fa il tuo sottoprocesso? C'è un modo per verificare che il tuo sottoprocesso stia facendo ciò che dovrebbe? –

+0

Il processo secondario esegue un nuovo processo .. es. esegue un altro programma con argomenti che fa tutto il lavoro. Più tardi ho solo controllato se è finito. – Schotime

0

Non ho familiarità con C# (preferisco il mio senza l'hash), ma è necessario un qualche tipo di interfaccia per il processo (IPC o qualunque sia il metodo più conveniente) in modo da poter inviare richieste di test e ottenere risultati indietro. Al livello più semplice, devi semplicemente inviare un messaggio al processo e ricevere il risultato. Oppure potresti avere più granularità e inviare comandi più specifici dalla tua bardatura di prova. Dipende da come è stato impostato l'ambiente di test dell'unità, più precisamente da come si inviano i comandi di test, come li si riceve e come si riportano i risultati.

Avrei personalmente un oggetto di prova all'interno del processo che semplicemente riceve, corre & riporta i risultati del test unitario e ha il codice di test all'interno dell'oggetto.

Problemi correlati