2013-04-24 80 views
7

在SpecFlow,我想檢查一個字符串的一個步驟定義,並在那一刻我做笨重的事情就是這樣人爲的例子存在:布爾參數步驟

[Given(@"Foo (bar)?")] 
public void GivenFoo(string bar) 
{ 
    if (bar == " bar") 
    { 
     // do bar 
    } 
} 

不過,我D喜歡做這樣的事情:

[Given(@"Foo (bar)?")] 
public void GivenFoo(bool bar) 
{ 
    if (bar) 
    { 
     // do bar 
    } 
} 

但我不能找出如何,這是可能的,如果是這樣怎麼樣?

+0

在這種情況下,布爾標誌的含義是什麼?當兩次==假時,做兩次事情意味着什麼? – 2013-04-24 14:54:53

+0

這是一個製作的例子,所以可能不是最好的。我只想要一個很好的方法來查找特徵文件中的步驟中是否存在字符串。 – 2013-04-24 14:57:06

+1

很高興看到真實的例子......對我而言,您的問題可能與您編寫場景的方式有關。 – 2013-04-24 14:59:12

回答

0

你是否在尋找:

[Given(@"I do something (times) times")] 
public void GivenIDoSomething(int times) 
{ 
} 

否則這似乎足以

[Given(@"I do something twice")] 
public void GivenIDoSomethingTwice() 
{ 
} 

編輯

我認爲,在步驟而不是if聲明你真的想獨立的步驟。

+0

忽略兩位;我已經編輯了這個問題,說明這個例子是完全構成的,而不是實際的代碼。 – 2013-04-24 14:59:44

+0

本來我是這麼做的,但是導致了難以提取的細微差異。在不擾亂客戶的情況下,我不能發佈我們擁有的例子。 – 2013-04-24 15:05:30

+0

你的步驟應該以'可重用'的方式實現,所以你應該能夠在場景中使用'GivenFoo'步驟兩次:'給定IDoFoo和IDoFoo當xxxx然後yyyy'。 SpecFlow中沒有任何內容檢查字符串的存在並將其轉換爲布爾值。你的'if(bar ==「bar」)'是我能想到的唯一方法,而不用重構你的步驟。 – 2013-04-24 15:08:45

1

根據您的問題和意見的Jakub的答案,它看起來像你試圖寫一個單一的步驟,可以通過您的網站覆蓋多個用戶的旅程。 SpecFlow並非真正爲此設計的,這可能表明您應該嘗試改進場景/功能的結構。

要回答你的問題直接,我不相信有一種方法來推斷基於在步驟定義特定字符串的存在布爾值。

如果你想堅持下來的這條路線,那麼你原來的例子可能是你最好的選擇。

我會建議你不要然而,採取這種方法,而是考慮重構你的步驟定義,以便你可以將它們連接在一起,並跨場景重複使用它們。我實際上正在努力思考一個適合您的解決方案的示例步驟定義。

多步驟方法的一個例子可能是這樣的:

Given I have logged in as an existing user //1 
And I have started my 6-step registration process //2 
And I have filled in valid address values on step 1 //3 
And I have left the fields blank on step 2 //4 
... etc 
When I save my registration 

而且你的步驟將是:

  1. 導航到登錄頁面,登錄爲有效用戶
  2. 導航到第1步
  3. 填寫有效輸入的字段,單擊'下一個'
  4. 單擊'下一個'

您只需要確保每一步都儘可能獨立於其他步驟,以便在不影響其他步驟的情況下將一個步驟替換爲一個細微差別的步驟(對於新的場景)。

通過這種方法,你仍然可以使用複雜的(和潛在的非常詳細)的場景結束,但我認爲這是不是巧言令色和包裝儘可能多的到一個單一的步驟定義一個更好的解決方案。你最終可能會遇到無法閱讀的場景,並且代碼也可能會很難讀取/維護。

+0

>「...試圖編寫一個單一的步驟,可以覆蓋通過您的網站的多個用戶旅程SpecFlow並非真正爲此設計」 看來SpecFlow的設計正是爲了這一點,因爲他們使他們的步驟全球化,甚至說「小心!將步驟定義與特徵耦合是一種反模式」。他們甚至連接到黃瓜文檔,說不重用步驟是「邪惡的,因爲它可能導致步驟定義的爆炸,代碼重複和高維護成本。」 – LouD 2016-02-19 14:44:20

0

你絕對可以做這樣的事情,使用StepArgumentTransformation方法。你仍然必須編寫解析器邏輯,但是你可以將它封存到一個只有執行解析的目的的方法中。

實施例的特徵文件:

Feature: I win if I am Batman 

Scenario: Happy 
    Given I am the Batman 
    Then I defeat the Joker 

Scenario: Sad 
    Given I am not the Batman 
    Then I am defeated by the Joker 

Specflow綁定(C#):

[Binding] 
public class IWinIfIAmBatmanFeature 
{ 
    private bool iAmBatman; 

    [StepArgumentTransformation(@"(am ?.*)")] 
    public bool AmToBool(string value) 
    { 
     return value == "am"; 
    } 

    [Given(@"I (.*) the Batman")] 
    public void WhoAmI(bool amIBatman) 
    { 
     iAmBatman = amIBatman; 
    } 

    [StepArgumentTransformation(@"(defeat|am defeated by)")] 
    public bool WinLoseToBool(string value) 
    { 
     return value == "defeat"; 
    } 

    [Then(@"I (.*) the Joker")] 
    public void SuccessCondition(bool value) 
    { 
     Assert.AreEqual(iAmBatman, value); 
    } 
} 

的關鍵因素是,在您Given子句正則表達式匹配由步驟參數變換匹配。因此,在I (.*) the Batman中,如果捕獲與StepArgumentTransformation的參數中的正則表達式匹配,就像它在AmToBool的屬性中所做的那樣,那麼這就是要使用的轉換。