2012-09-25 10 views
10

Ich habe mehrere Feature-Dateien mit einigen Szenarien. Ich muss mehrere Szenarien oder Features ignorieren, die mit einigen @tag markiert sind, abhängig von einigen Bedingungen. Ich habe specflow documentation gelesen, aber habe dort nicht etwas gefunden, das für meine Lösung nützlich sein kann. Ich möchte etwas verwenden, wieWie programmiere ich einige Akzeptanztests mit TechTalk.SpecFlow und C# programmatisch?

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

Auch habe ich versucht, dynamisch hinzuzufügen oder zu entfernen Tags

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

aber es hat nicht funktioniert. Vielleicht gibt es eine andere Möglichkeit, Tags dynamisch hinzuzufügen oder zu entfernen? Oder einige Methoden in ScenarioContext Klasse, die aktuelle Szenario ignorieren?

Antwort

21

Sie haben mindestens 3 Möglichkeiten:

  1. Configure Specflow zu behandeln Schritte anhängigen mit missingOrPendingStepsOutcome="Ignore" ignorieren dann können Sie schreiben:

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

    Es ist vielleicht nicht das, was Sie wollen, je nach Anforderungen für ausstehende Schritte.

  2. Verwenden Sie die integrierte Methode zum Testen von Einheitentests, um den Test während der Laufzeit zu ignorieren. Also, wenn Sie z.B. NUnit dann mit dem Assert.Ignore():

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

    Ich denke, das ist die sauberste/einfachste Lösung.

  3. Oder wenn Sie es ein Test-Framework-unabhängige Art und Weise wollen tun, und Sie haben keine Angst zu Chaos mit Specflow Interna dann können Sie die IUnitTestRuntimeProvider Schnittstelle verwenden:

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

    Dies wird auch funktionieren, wenn Sie Ihre ändern Unit Testprovider, aber es ist nicht garantiert, dass diese API die Funktion nicht einreißen wird.