9

[バインディング] でマークされた 2 つのクラス (クラス A と B) があります。現在、機能ごとにクラスを使用しています。クラス A と B の両方に、次のようなステップがあります。

   [Given(@"an employee (.*) (.*) is a (.*) at (.*)")]
   public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName)

クラス A で定義された機能のシナリオを実行し、テスト ランナーが上記のステップを実行すると、代わりにクラス B の一致するステップが実行されます。

「ステップ」もグローバルですか?「フック」メソッドのみがグローバルであると思いました。つまり、BeforeScenario、AfterScenario です。「Given」、「Then」、および「When」には、この動作は必要ありません。これを修正する方法はありますか?2 つのクラスを異なる名前空間に配置しようとしましたが、これも機能しませんでした。

また、「Given」を別々のクラスに入れると、各「Given」を独立させたいということで、SpecFlow を誤用する可能性がありますか?

4

1 に答える 1

14

はい ステップは (デフォルトで) グローバルです。そのため、同じ Step に一致する RegExp を持つ 2 つの属性を定義すると、問題が発生します。別々のクラスであっても。

別のクラスに属していること、または他の配置 (他のアセンブリであっても) は、SpecFlow がそれをグループ化する方法とは関係ありません。これは、Step を照合しようとする、Given、When、Then の大きなリストにすぎません。

しかし、この問題を解決する Scoped Steps という機能があります。ここで確認してください: https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

Step Defintion メソッドに別の属性 (StepScope) を配置すると、そのスコープが適用されます。たとえば、次のようにします。

[Given(@"I have a step definition that is scoped to tag (?:.*)")]
[StepScope(Tag = "mytag")] 
public void GivenIHaveAStepDefinitionThatIsScopedWithMyTag()
{
    stepTracker.StepExecuted("Given I have a step definition that is scoped to tag 'mytag'");
}

... または、ステップ定義クラス全体を単一の機能にスコープするには:

[Binding]
[StepScope(Feature = "turning on the light should make it bright")]
public class TurningOnTheLightSteps
{
    // ...
}

このステップ定義は、タグに StepScope を使用しています。次の方法でステップの範囲を絞り込むことができます。

  • 鬼ごっこ
  • シナリオタイトル
  • 特集タイトル

素晴らしい質問です。私は今までそれが何のためにあるのか完全には理解していませんでした;)

于 2011-03-28T19:55:46.360 に答える