15

いくつかのシナリオでいくつかの機能ファイルがあります。いくつかの条件に応じていくつかのマークが付けられたいくつかのシナリオまたは機能を無視する必要があり@tagます。スペックフローのドキュメントを読みましたが、ソリューションに役立つものが見つかりませんでした。のようなものを使いたい

[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または、現在のシナリオを無視するクラスのいくつかのメソッド?

4

1 に答える 1

29

少なくとも3つのオプションがあります。

  1. 保留中のステップを無視として扱うように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");
    }
    

    これは、ユニットのtestproviderを変更しても機能しますが、このAPIが将来壊れないという保証はありません。

于 2012-09-25T19:08:28.900 に答える