2010-06-28 7 views
5

sto usando VS2010, ho il metodo seguente invito:MSTest rispetto all'attributo [Conditional()]?

[Conditional("DEBUG")] 
public void VerboseLogging() { } 

public void DoSomething() { 
    VerboseLogging(); 
    Foo(); 
    Bar(); 
} 

poi ho uno unit test per il metodo DoSomething che verifica che emette una corretta registrazione.

[Conditional("DEBUG"), TestMethod()] 
public void EnsureVerboseLog() { 
    DoSomething(); 
    VerifyVerboseLoggingCalled(); // <-- fail in release builds since VerboseLogging() calls get eliminated. 
} 

Sembra che MSTest vede solo TestMethod e lo esegue (la generazione di test non) anche se ho segnato con Conditional("DEBUG") e compilarlo in modalità di rilascio.

Quindi, esiste un modo per escludere determinati test in base alla costante di compilazione diversa da #if?

risposta

6

ConditionalAttribute non influisce sulla compilazione o meno di un metodo in un'applicazione. Controlla se le chiamate al metodo sono o meno compilate nell'applicazione.

In questo esempio non è presente la chiamata a EnsureVerboseLog. MSTest vede solo un metodo nell'assemlby con l'attributo TestMethod e lo esegue correttamente. Al fine di evitare MSTest l'esecuzione del metodo è necessario effettuare una delle seguenti

  1. Non compilarlo nella vostra applicazione (possibile attraverso # se di)
  2. Non annotare con il TestMethod attribuire
+0

MSTest succhia un grande rispetto per MbUnit/Il Cairo, eh? –

1

Una soluzione è impostare l'attributo Priority su -1 sul metodo. Quindi esegui mstest con "minpriority: 0" come argomento.

[TestMethod()] 
[Priority(-1)] 
public void Compute_Foo() 
{ 
    This method will not be executed 
} 
3

Quindi, c'è un modo per escludere alcuni test a seconda compilation costante diverso #if?

Perché ignorare l'ovvio? è leggibile, fa esattamente il lavoro desiderato, ecc ...

[TestMethod] 
#if !DEBUG 
[Ignore] 
#endif 
public void AnyTest() 
{ 
    // Will invoke for developer and not in test-server! 
} 

HTH ..