2012-07-19 7 views
6

ClassInitialize sembra essere chiamato per ogni test. Immagino sia perché viene creata una nuova classe per ogni test.MSTest ClassInitialize una volta per l'intera classe

Perché? Ogni altro quadro non lo fa!

In ogni caso ... Ho bisogno di eseguire un metodo (non statico) sulla classe. Devo anche eseguire tutti i metodi di test all'interno della stessa istanza della classe.

Sono su un torrente senza una pagaia?

+0

un motivo per cui non puoi chiamarne uno, quindi chiamare l'altro? – Wug

+1

Tutto in un solo test? Potrei farlo, ma perderei immediatamente la visibilità su quali test fallirono. Un test chiamato "AllTests"? –

risposta

15

ClassInitialize viene chiamato una volta da MSTest prima che venga invocato uno qualsiasi dei numeri TestMethod, vedere osservazioni here. TestInitialize viene chiamato una volta prima di ogni metodo di prova. MSTest crea una nuova istanza della classe di test per ciascuna chiamata TestMethod. Questo è il motivo per cui ClassInitialize è un metodo statico.

Ho bisogno di eseguire un metodo (non statico) sulla classe. Devo anche eseguire tutti i metodi di test all'interno della stessa istanza della classe.

Vuoi dire è necessario eseguire un metodo sulla TestClass o la classe in prova (la classe in realtà si sta testando)?

In entrambi i casi, è possibile avere un membro statico nel TestClass e inizializzarlo una volta in ClassInitialize. Sarà creato solo una volta ed esiste per tutta la durata dei test. Puoi invocare un metodo solo una volta. È quindi possibile utilizzare questa singola istanza in ciascuno dei metodi di test.

Una cosa di cui essere a conoscenza è che MSTest può intercalare test di classi diverse. Pertanto, se si dispone di uno stato mutabile globale a cui si accede da più di uno ClassInitialize (o test del caso), potrebbero verificarsi situazioni imprevedibili. Per questo motivo, la statica è meglio evitare.

Il requisito che tutti i metodi devono essere eseguiti sulla stessa istanza è piuttosto insolito. Forse c'è un modo per rifattorizzare il codice per eliminare questo vincolo?