2012-09-25 9 views
10

Mam kilka plików cech z pewnymi scenariuszami. Muszę zignorować kilka scenariuszy lub funkcji oznaczonych numerem @tag w zależności od pewnych warunków. Przeczytałem specflow documentation, ale nie znalazłem tam czegoś, co może być przydatne dla mojego rozwiązania. Chcę użyć coś jakJak programowo zignorować niektóre testy akceptacyjne za pomocą TechTalk.SpecFlow i C#?

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     // This is the hot spot 
     Scenario.DoSomethingToIgnoreScenarioIfConditionButRunScenarioIfConditionFalse(); 
    }   
} 

także Próbowałem dynamicznie dodawać lub usuwać tagi

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     ScenarioContext.Current.ScenarioInfo.Tags.ToList().Add("ignore"); 
    }   
} 

ale to nie działa. Może istnieje inny sposób dynamicznego dodawania lub usuwania tagów? Lub niektóre metody z klasy ScenarioContext, które zignorują bieżący scenariusz?

Odpowiedz

21

mieć co najmniej 3 opcje:

  1. Configure Specflow do leczenia w toku czynności, jak ignorować z missingOrPendingStepsOutcome="Ignore" wtedy można napisać:

    if(IgnoreTests) 
    { 
        ScenarioContext.Current.Pending(); 
    } 
    

    To może nie to, co chcesz w zależności od Państwa wymagania dotyczące oczekujących kroków.

  2. Użyj wbudowanej metody testowania urządzenia, aby zignorować test w czasie wykonywania. Więc jeśli używasz np. NUnit następnie z Assert.Ignore():

    if(IgnoreTests) 
    { 
        Assert.Ignore(); 
    } 
    

    myślę, że to jest najczystszym/Najprostszym rozwiązaniem.

  3. Albo jeśli chcesz zrobić mu badania ramową-agnostyk drogę i nie boją się zadzierać z wewnętrznymi Specflow następnie można użyć interfejsu IUnitTestRuntimeProvider:

    if (IgnoreTests) 
    { 
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current 
         .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored"); 
    } 
    

    to będzie działać, nawet jeśli zmienisz unit testprovider, ale nie gwarantuje, że ten interfejs API nie złamie tej funkcji.