2012-12-07 50 views
9

目前更PARAMS我們有這一步:specflow: - 「找到的一步曖昧的步驟定義」時,1級比其他

[When(@"I set the scenario price for product (.*) to (.*)")] 
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr) 

我要補充步驟:

[When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone") 
public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone) 

然而規格流給出兩個步驟之間的誤差的「找到的步驟歧義步驟定義」。

我已經厭倦了:

[When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone")] 
    [When(@"I set the scenario price for product (.*) to (.*)")] 
    public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone) 

但失敗,出現「綁定錯誤:參數數量不匹配」我希望它會在第二個「什麼時候」通過。

+0

我不能用測試中的類似步驟重現模糊步驟問題,但參數計數不匹配是因爲每個正則表達式模式代碼都會爲方法生成一個參數。它似乎也不支持默認參數值。 –

+0

@Admin,這聽起來像一個specflow中的bug,因爲我不明白爲什麼「when」和「given」以不同的方式進行匹配。 –

回答

11

的問題是第二個你(。*)。這可以擴展爲匹配「abc區域中的xyz」。你能改爲匹配一個單詞嗎?即(\ w +)

[When(@"I set the scenario price for product (.*) to (\w+)")] 

那樣會阻止abc區域中較短的Regex匹配。

您可以通過註釋掉你不再當屬性,方法和調試,看看比賽中較小的一個進行測試。

而且,你總是必須有相同數量的正則表達式作爲參數,這就是爲什麼合併一個不工作。


這對我不起作用,這是由於「0.99」和「。」的價格。不與\ w匹配。然而,這是有效的:

[When(@"I set the scenario price for product (.*) to (\S+)")] 
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr) 

因爲我們的「測試值」沒有空格。

+0

如果您正在使用數字,請考慮(\ d +(\。\ d +)?),它與小數位和無小數位匹配 – AlSki

3

我最初認爲這是因爲在第一步定義的結尾正則表達式:

[When(@"I set the scenario price for product (.*) to (.*)")] 

這將捕捉(或匹配),將進入你的後續定義相同的字符串。

但是,這兩個步驟的實現方法包含模棱兩可的參數類型。我不能開始複製這一點,因爲我以前int(按我的意見),但使用string可以重現這個問題,因爲string是模糊的。在步驟定義文件中作爲參數提供的任何參數都可以視爲string

更改您的步法以下幾點:

public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, double price, string zone) 

public void WhenISetTheScenarioPriceForProductPToN(string product, double price) 

現在雖然正則表達式並沒有改變,因此在理論上仍然會貪婪地匹配,SpecFlow提供轉換爲原始類型(以及其他類型的通過自定義轉換),以便忽略了其餘的句子。這意味着,因爲它檢測到double後的最終string參數(相對於不能夠決定判決的部分是否字符串參數匹配或具有嵌入多個參數),它一點也不含糊。