2012-11-01 12 views
5

Używam SpecFlow z Nunit i próbuję skonfigurować moje testy środowiskowe za pomocą TestFixtureSetUpAttribute, ale nigdy nie jest wywoływana.Specflow z NUnit nie respektuje TestFixtureSetUpAttribute

Próbowałem już używać atrybutów MSTests i ClassInitialize, ale to samo się dzieje. Funkcja nie jest wywoływana.

Wszelkie pomysły Dlaczego?

[Binding] 
public class UsersCRUDSteps 
{ 
    [NUnit.Framework.TestFixtureSetUpAttribute()] 
    public virtual void TestInitialize() 
    { 
     // THIS FUNCTION IS NEVER CALLER 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    private string username, password; 

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")] 
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password) 
    { 
     this.username = username; 
     this.password = password; 
    } 

    [When(@"I press register")] 
    public void WhenIPressRegister() 
    { 
    } 

    [Then(@"the result should be default account created")] 
    public void ThenTheResultShouldBeDefaultAccountCreated() 
    { 
    } 

Rozwiązanie:

[Binding] 
public class UsersCRUDSteps 
{ 
    [BeforeFeature] 
    public static void TestInitialize() 
    { 
     // THIS FUNCTION IS NEVER CALLER 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    private string username, password; 

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")] 
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password) 
    { 
     this.username = username; 
     this.password = password; 
    } 

    [When(@"I press register")] 
    public void WhenIPressRegister() 
    { 
    } 

    [Then(@"the result should be default account created")] 
    public void ThenTheResultShouldBeDefaultAccountCreated() 
    { 
    } 

Odpowiedz

6

Twój TestInitialize nie nazywa, ponieważ jest wewnątrz klasy kroki i nie wewnątrz W testach jednostkowych (ponieważ rzeczywista próba jednostka jest wewnątrz .cs który jest generowany .feature plik).

SpecFlow ma swoje własne zdarzenia Test-lifetime które nazywane są haki, są to wszystkie predefiniowane haki:

  • [BeforeTestRun]/[AfterTestRun]
  • [BeforeFeature]/[AfterFeature]
  • [BeforeScenario]/[AfterScenario]
  • [BeforeScenarioBlock]/[AfterScenarioBlock]
  • [BeforeStep]/[AfterStep]

Należy pamiętać, że pozwala to na większą elastyczność konfiguracji. Dodatkowe informacje: see the documentation.

Opierając się na fakcie, że chcesz użyć TestFixtureSetUp przypisują prawdopodobnie będziesz potrzebował haka BeforeFeature która będzie wywoływana raz przed każdą funkcją, więc trzeba napisać:

[Binding] 
public class UsersCRUDSteps 
{ 
    [BeforeFeature] 
    public static void TestInitialize() 
    {    
     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    //... 
} 

Należy zauważyć, że atrybut [BeforeFeature] potrzebuje metody static.

Należy również pamiętać, że jeśli korzystasz z integracji VS, istnieje typ elementu projektu o nazwie SpecFlow Hooks (event bindings), który tworzy klasę wiązania z pewnymi wstępnie zdefiniowanymi zaczepami, które ułatwiają rozpoczęcie pracy.

+1

Dziękuję, to działa. Muszę tylko zmienić funkcję na statyczną – muek