2010-04-18 7 views
8

Ich habe diese Eigenschaft:Kann ich NUnit so konfigurieren, dass Debug.Fail beim Ausführen meiner Tests kein Meldungsfeld anzeigt?

public SubjectStatus Status 
    { 
     get { return status; } 
     set 
     { 
      if (Enum.IsDefined(typeof(SubjectStatus), value)) 
      { 
       status = value; 
      } 
      else 
      { 
       Debug.Fail("Error setting Subject.Status", "There is no SubjectStatus enum constant defined for that value."); 
       return; 
      } 
     } 
    } 

und diese Einheit Test

[Test] 
    public void StatusProperty_StatusAssignedValueWithoutEnumDefinition_StatusUnchanged() 
    { 
     Subject subject = new TestSubjectImp("1"); 

     // assigned by casting from an int to a defined value 
     subject.Status = (SubjectStatus)2; 
     Assert.AreEqual(SubjectStatus.Completed, subject.Status);    

     // assigned by casting from an int to an undefined value 
     subject.Status = (SubjectStatus)100; 
     // no change to previous value 
     Assert.AreEqual(SubjectStatus.Completed, subject.Status);    
    } 

Gibt es eine Möglichkeit, ich Debug.Fail Anzeigen eines Meldungsfeld verhindern kann, wenn ich meine Tests laufen, aber lassen Sie es zeigen, mir eine wenn ich meine Anwendung debugge?

+0

Ich habe meine Antwort aktualisiert, um die Implementierung des Ablaufprotokoll-Listener-Plug-Ins für NUnit zu enthalten, wenn Sie interessiert sind. –

+0

Großartig, genau die Art von Informationen, die ich suchte! – Grokodile

Antwort

2

Die Standard-Art, wie ich es immer getan habe dies ein Plugin für NUnit zu schaffen. Das Plug-in hebt einfach die Registrierung des Standard-Trace-Listeners auf und registriert eine Ersetzung, die eine Exception auslöst, wenn Assert/Trace.Fail ausgelöst wird. Ich mag diesen Ansatz, weil Tests immer noch fehlschlagen, wenn ein Assert ausgelöst wird, keine Nachrichtenfelder angezeigt werden und Sie Ihren Produktionscode nicht ändern müssen.

Edit - hier ist der Plugin-Code in seiner Gesamtheit. Sie sind auf eigene Faust für obwohl das eigentliche Plugin Gebäude - überprüfen Sie die NUnit Standort :)

[NUnitAddin] 
public class NUnitAssertionHandler : IAddin 
{ 
    public bool Install(IExtensionHost host) 
    { 
     Debug.Listeners.Clear(); 
     Debug.Listeners.Add(new AssertFailTraceListener()); 
     return true; 
    } 

    private class AssertFailTraceListener : DefaultTraceListener 
    { 
     public override void Fail(string message, string detailMessage) 
     { 
      Assert.Fail("Assertion failure: " + message); 
     } 

     public override void Fail(string message) 
     { 
      Assert.Fail("Assertion failure: " + message); 
     } 
    } 
} 
+0

Klingt gut, ist es einfach, ein NUnit-PlugIn zu schreiben? – Grokodile

+0

Es ist nicht so schlimm, es gibt ein paar Dinge, die Sie tun müssen, Dateien zu setzen, um local = false und einige andere Macken zu kopieren, aber ich habe das Projekt nicht hier vor mir, so dass ich das genaue nicht posten kann Schritte. Es ist jedoch buchstäblich ein DLL-Plugin mit einer Klasse darin :) –

0

Anstatt Debug.Assert direkt aufzurufen, können Sie eine Wrapper-Methode aufrufen, die vor dem Aufruf von Debug.Assert prüft, ob ein Debugger angehängt ist. (Vermutlich sollte es eine Ausnahme auslösen, wenn kein Debugger ist so angebracht, dass die Tests fehlschlagen.) Z.B .:

[Conditional("DEBUG")] 
public static void Assert(bool condition) 
{ 
    if (Debugger.IsAttached) 
    { 
     Debug.Assert(condition); 
    } 
    else 
    { 
     throw new SomeException(); 
    } 
} 
+0

Danke, ich schreibe mir eine Wrapperklasse, die ich umstellen kann, gute Idee. – Grokodile

8

Eine alternative Art und Weise, die nicht Ihre Produktion Code zu ändern erfordert oder eine benutzerdefinierte schreiben NUnit-Add-in, wäre Ersetzen der Ablaufverfolgungslistener in einem Setup-Gerät.

z. Fügen Sie die folgende Klasse in dem Namespace, in dem sich Ihre Tests befinden, hinzu:

+1

Sie brauchen nicht einmal einen benutzerdefinierten Trace-Listener, sondern installieren einfach den ConsoleTraceListener. Dann gehen alle Ihre Debug.Assert/Fail-Nachrichten auf die NUnit-Textausgabe-Registerkarte, ohne die Tests anderweitig zu beeinflussen. – yoyo

+0

Update für NUnit 3.0: [SetupFixture] steht in Konflikt mit [SetUp] und [TearDown]. Aber das ist in Ordnung - fügen Sie einfach die ganze Klasse ohne die anfängliche [SetUpFixture] in Ihre TextFixture ein. Besser noch, ändere [SetUp] zu [OneTimeSetUp] (ebenfalls für TearDown) und es wird nur einmal ersetzt! Das funktioniert wirklich süß! – shipr

Verwandte Themen