2011-03-28 29 views
9

我有兩個類(A和B)都標有[綁定]。目前我正在使用每個功能的類。類A和B都具有一個步驟,看起來像這樣:SpecFlow - 步驟(給定)在不同的類中具有相同的正則表達式不能獨立執行

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

當運行在類A中定義的特徵的情況下,和測試運行執行上述指示的步驟中,類B的匹配步驟得到改爲執行。

「Steps」也是全球性的嗎?我認爲只有「鉤子」方法是全球性的,即BeforeScenario,AfterScenario。我不希望這種行爲是「給定」,「然後」和「何時」。有沒有什麼辦法解決這一問題?我試着把這兩個類放在不同的命名空間中,這也不起作用。

另外,我是否可能會濫用SpecFlow,希望每個「給定」是獨立的,如果我把它們放在單獨的類中?

回答

13

是步驟是(默認情況下)全局。因此,如果您定義了兩個具有與相同步驟匹配的RegExps的屬性,就會遇到麻煩。即使他們在不同的班級。

在單獨的類或其他位置(其他程序集甚至)與SpecFlow如何對它進行分組沒有任何關係 - 它只是Given的一個大列表,When's和Then是它試圖匹配Step。

但有一個稱爲作用域步驟的功能可以解決您的這個問題。點擊此處查看:https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

這個想法是,您將另一個屬性(StepScope)放在Step Defintion方法上,然後它將遵守該範圍。像這樣,例如:

[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。你可以範圍的步驟是:

  • 標籤
  • 場景標題
  • 功能標題

大問題!我還沒有完全明白那是什麼,直到現在;)

+0

非常好,我今天早上和SpecFlow一起工作,發現了這個問題,並且認爲我今天晚些時候需要答案 - 我這麼做了。 – cfeduke 2011-03-28 21:07:13

+0

所以我想如果我的問題是試圖組織我正在做的類(按功能)的步驟,那麼更合適的組織將通過行爲。通過這種方式,一系列行爲可以逐漸構建並在稍後重新引用。不知道是否有類似TestDox的SpecFlow工具? – SideFX 2011-03-29 00:14:27

+0

是的,您可能最好爲每個邏輯實體組織您的步驟定義(或更好的放置行爲)。我已經創建了一個例子,你可能會覺得有用。看看這裏:http://www.marcusoft.net/2011/01/kanbanboards-part-iitwo-step-forward.html?m=0 – 2011-03-29 08:55:08

相關問題