2012-09-25 23 views
10

我有幾個功能文件,有些場景。我需要忽略幾個場景或功能,根據某些條件標有一些@tag。我已閱讀specflow documentation,但沒有找到對我的解決方案有用的東西。我想使用類似如何使用TechTalk.SpecFlow和C#以編程方式忽略一些驗收測試?

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

而且我試着動態添加或刪除標籤

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

,但沒有奏效。也許有其他方式來動態添加或刪除標籤?或者ScenarioContext類中會忽略當前場景的一些方法?

回答

21

您至少有3個選項:

  1. Configure Specflow處理未決的步驟與missingOrPendingStepsOutcome="Ignore"忽略,那麼你可以這樣寫:

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

    這也許是你根據需要不是你待處理步驟的要求。

  2. 使用您的單元測試框架內置方法在運行時忽略測試。所以如果你正在使用例如NUnit的然後用Assert.Ignore()

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

    我覺得這是最乾淨的/最簡單的解決方案。

  3. 或者,如果你想要做一個測試框架無關的方式,你不害怕與Specflow內部的混亂,那麼你可以使用IUnitTestRuntimeProvider接口:

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

    如果你改變這樣,即使你的工作單元測試提供程序,但不保證此API不會中斷該功能。

相關問題