2010-06-10 5 views
11

Ich möchte eine Methode mit einer hohen zyklomatischen Komplexität (Seufzer) testen und ich hätte gerne eine Klasse innerhalb der Testklasse, so dass eine Methode Testklasse als Knoten in erscheint der Baum. Ist es mit Nunit möglich und wie?Nunit: Ist es möglich, dass Tests verschachtelt erscheinen

+0

Was Sie nisten die Tests versuchen zu erreichen? – Pedro

+0

Ist das nicht offensichtlich aus der Frage? – epitka

+0

Möchten Sie nur einige Tests durchführen, aber keine anderen? Brauchst du das nur, um sie optisch zu trennen? – Pedro

Antwort

17

Sie können es mit verschachtelten Klassen tun, sehr ähnlich dem Beispielcode in Ihrer Frage.

Der einzige Unterschied zu Ihrem Code ist, dass die äußere Klasse das [TestFixture] Attribut nicht benötigt, wenn es nur für die Struktur verwendet wird und keine Tests selbst hat.

Sie können auch alle inneren Klassen haben eine Setup Methode teilen, indem sie sie in die äußere Klasse setzen und die inneren Klassen von der äußeren Klasse erben mit:

using NUnit.Framework; 

namespace My.Namespace 
{ 
    public class MyEntityTests 
    { 
     [SetUp] 
     public void Setup() 
     { 
     } 

     [TestFixture] 
     public class MyComplexMethodTests : MyEntityTests 
     { 
      [Test] 
      public void when_some_condition_than() 
      { 
      } 

      [Test] 
      public void when_some_other_condition_then() 
      { 
      } 
     } 
    } 
} 

Im NUnit GUI, wird dieser Test-Klasse wie folgt aussehen:

NUnit GUI

+3

Der Resharper-Testläufer scheint alle Tests zu erkennen, die auf diese Weise strukturiert sind. : \ –

+0

@JohnHoerr In neueren Versionen von ReSharper funktioniert das. –

+0

Wissen Sie, ob innere Klassen eine zusätzliche SetUp-Methode haben können? Dann könnte ein klassenübergreifendes Setup für alle passieren, und ein methodenspezifisches Setup könnte innerhalb der inneren Klasse stattfinden. Nevermind, fand die Antwort hier: https://stackoverflow.com/questions/17659213/nunit-and-setup-in-base-classes – IronSean

1

Es klingt wie Sie haben eine Klasse, die Sie testen möchten, aber Sie haben zwei Sätze/Arten von Tests zu laufen. Der einfachste Weg dazu besteht darin, zwei Testfelder zu erstellen, jeweils eines. Eine andere Möglichkeit besteht darin, jeden Test in eine Kategorie einzuordnen.

Edit: Wenn alle Tests auf der gleichen Methode sind, ist eine Option, das TestCase Attribut zu verwenden und die Parameter für jeden Test (sowie das erwartete Ergebnis) anzugeben. Die GUI wird jeden Satz TestCase-Parameter verschachteln unter einer einzigen Instanz dieses Testnamens. Dies setzt voraus, dass sich alle Ihre Tests ähnlich verhalten, dh dieselben grundlegenden Asserts oder ExpectedExceptions.

6

ich verwendet habe, Namespaces, dieses Verhalten zu bekommen (missbraucht?):

namespace MyEntityTests.MyComplexMethodTests 
{ 
    [TestFixture] 
    public class when_some_condition_than 
    { 
     [Test] 
     public void it_should_do_something() 
     {   
     } 
    } 

    [TestFixture] 
    public class when_some_other_condition_than 
    { 
     [Test] 
     public void it_should_do_something_else() 
     {   
     } 
    } 
} 

die Ihnen:

MyEntityTests 
- MyComplexMethodTests 
    - when_some_condition_than 
    - it_should_do_something 
    - when_some_other_condition_than 
    - it_should_do_something_else 

In diesem Fall habe ich normalerweise die TestFixture das definieren, verwenden werden Kontext für den Test.

+0

+1 - Gute Lösung für meine aktuellen Bedürfnisse. – JOpuckman

Verwandte Themen