2010-06-28 6 views
5

ich VS2010 bin mit, habe ich den folgenden Methodenaufruf:Machen MSTest respektieren [Conditional()] Attribut?

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

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

Dann habe ich einen Komponententest für die DoSomething Methode, die überprüft, ob es der richtige Protokollierung aussendet.

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

Es scheint, dass MSTest sieht nur TestMethod und führt sie aus (Erzeugen fehlgeschlagenen Test), obwohl ich es mit Conditional("DEBUG") markiert haben und es im Release-Modus kompilieren.

Also gibt es eine Möglichkeit, bestimmte Tests abhängig von der Kompilierungskonstante außer #if auszuschließen?

Antwort

6

Die ConditionalAttribute hat keinen Einfluss darauf, ob eine Methode in eine Anwendung kompiliert wird oder nicht. Es steuert, ob Aufrufe der Methode in die Anwendung kompiliert werden.

In diesem Beispiel wird EnsureVerboseLog nicht aufgerufen. MSTest sieht gerade eine Methode in der Assembly mit dem Attribut TestMethod und führt sie korrekt aus. Um MSTest Laufen des Verfahrens zu verhindern, werden Sie eine der folgenden

  1. Nicht kompilieren es in Ihre Anwendung (möglich bis # wenn die) tun müssen
  2. es nicht mit Anmerkungen versehen mit dem Testmethod Attribut
+0

MSTest einen großen zu MbUnit/Kairo im Vergleich zum kotzen, eh? –

1

Eine Umgehung ist das Attribut Priority auf -1 zu Ihrer Methode zu setzen. Führen Sie dann mstest mit "minpriority: 0" als Argument aus.

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

So ist es eine Möglichkeit, bestimmte Tests auszuschließen, je nach Zusammenstellung konstant andere als #if?

Warum das Offensichtliche ignorieren? es ist lesbar, tut genau die gewünschte Arbeit, etc ...

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

HTH ..