2015-07-10 3 views
9

Ich habe einige alte MbUnit Code, der wie folgt aussieht:Kann ein TestActionAttribute in NUnit BeforeTest vor der eigenen SetUp-Methode des Fixtures ausführen?

public class MyFixture { 

    [SetUp] 
    public void SetUp() { 
     // Add data to database 
    } 

    [Test, Rollback] 
    public void DoTest() { 
     // Tests with the data 
    } 
} 

Mein neues NUnit Rollback-Attribut ein bisschen wie folgt aussieht:

public class RollbackAttribute : TestActionAttribute 
{ 
    public override void BeforeTest(TestDetails testDetails) 
    { 
     // Begin transaction 
    } 

    public override void AfterTest(TestDetails testDetails) 
    { 
     // Abort transaction 
    } 
} 

Der Transfer abbrechen sollte in der SetUp hinzugefügt, um die neuen Daten ein Rollback Methode sowie Änderungen während des Tests selbst. Unglücklicherweise scheint NUnits BeforeTest nach der SetUp-Methode des Geräts zu laufen, so dass die während SetUp hinzugefügten Daten nicht zurückgesetzt werden.

Gibt es eine Möglichkeit, BeforeTest vor dem Setup auszuführen?

Eine Option wäre eine Basisklasse und ersetze die vorhandenen Rollback-Attribute durch zusätzlichen Code in SetUp und TearDown. Einige meiner Tests erfordern jedoch das Ausführen außerhalb einer Transaktion (sie erstellen während des Testlaufs mehrere Transaktionen) Transaktionen um alle Testfälle würden ein wenig Sorgfalt erfordern. Ich würde lieber eine Lösung finden, die die vorhandenen Rollback-Attribute wiederverwenden kann.

Antwort

4

Gibt es eine Möglichkeit, BeforeTest vor dem Setup auszuführen?

Ich glaube nicht, siehe z.B. this related discussion on google groups. Das Problem, das dort diskutiert wird, ist sehr ähnlich, wie Sie sehen können, Code in SetUp Methode würde sogar vor BeforeTest Methode auf Test Fixture-Ebene (Sie haben es auf Test-Ebene) ausgeführt werden.

Umgehung von meiner Sicht wäre die SetUpAttribute aus dem SetUp Verfahren zu entfernen und die SetUp Methode explizit zu Beginn des jeweiligen Tests nennen, das heißt:

public class MyFixture 
{ 
    public void SetUp() 
    { 
     // Add data to database 
    } 

    [Test, Rollback] 
    public void DoTest() 
    { 
     SetUp(); 

     // Tests with the data 
    } 
} 

Ihre Frage erinnerte mich auch an Frage dass marc_s in this SO thread ausgelöst wurde. Frage hat nichts mit Ihrem Problem zu tun, aber er benutzte das gleiche Konstrukt wie ich oben vorschlagen, so ist es vielleicht nicht , dass schlechte Idee.

EDIT:

Here ist eine offene Frage auf NUnit der Github. Aber noch, angefordert, um es:

BeforeTest (BaseFixture)
BaseSetUp BeforeTest (Fixture)
SetUp
BeforeTest (Test)
-Test AfterTest (Test)
TearDown AfterTest (Fixture)
BaseTearDown AfterTest (BaseFixture)

Also nicht genau was du willst, "BeforeTest (Test)" würde ausgeführt werden d nach dem Setup.

+0

Ja, ich denke, die anfängliche Implementierung, die ich refactoring war ein bisschen rückwärts - die SetUp-Methode sollte sich nicht auf ein pro-Test-Attribut verlassen, um sicherzustellen, dass sein Zustand ordnungsgemäß bereinigt wird, so ist es vollständig vernünftig, das ändern zu müssen. – Douglas

+0

Es gibt keine Zugehörigkeit.Ich werde das Kopfgeld vergeben, sobald ich meine eigenen Sachen beendet habe und bin zu dem Schluss gekommen, dass diese Antwort für mich funktioniert. – Puppy

+0

@Puppy ah, ich sehe, danke, ich dachte, Sie sind zwei Mitarbeiter. –

Verwandte Themen