2012-09-20 2 views
35

Ho avuto difficoltà con questo, speriamo che possa aiutare qualcun altro.Classi contrassegnate con TestInitialize e TestCleanup non in esecuzione

Mentre la creazione di test dell'unità utilizzando MSTEST ho scoperto di ripetere lo stesso codice in ciascuna prova, e trovato un paio di attributi pratici (TestInitialize, TestCleanup, ClassInitialize e ClassCleanup).

Presumibilmente, quando si contrassegna un metodo con uno di questi attributi, è necessario eseguirlo automaticamente (prima di ogni test, dopo ogni test, prima di tutti i test e dopo tutti i test rispettivamente). Frustrante, questo non accadde e le mie prove fallirono. Se si chiamano direttamente questi metodi dalle classi contrassegnate con l'attributo TestMethod, i test sono riusciti. Era evidente che non stavano eseguendo da soli.

Ecco alcuni esempi di codice che usavo:

[TestInitialize()] 
private void Setup() 
{ 
    _factory = new Factory(); 
    _factory.Start(); 
} 

Allora, perché non è questo l'esecuzione?

risposta

84

Il trucco è quello di rendere questi metodi public:

[TestInitialize()] 
public void Setup() 
{ 
    _factory = new Factory(); 
    _factory.Start(); 
} 

Quando sono private essi non eseguono.

+3

Inoltre, non funzioneranno se statici. – stuartdotnet

+0

@Stefan de Kok: Incredibile che l'abbia trascurato. Grazie per il suggerimento! – christoph

+1

Inoltre non funzioneranno se asincroni. – andrew

9

TestInitialize e TestCleanup vengono eseguiti prima e dopo tutti i test, non prima e dopo ciascuno di essi.

che è sbagliato, si veda ad esempio questo link: http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/85fb6549-cbaa-4dbf-bc3c-ddf1e4651bcf

Vedi anche MSDN

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute.aspx

Il codice di esempio mostra come utilizzare TestInitialize, ClassInitialize e AssemblyInitialize.

1

Avevo anche il problema e, a causa del mio fraintendimento sul modo in cui i metodi vengono richiamati, ho risolto questo problema: rendere i test ereditari dalla classe contenente i metodi TestInitialize e TestCleanup.