我正在使用Behat + Mink测试我的PHP / bootstrap应用程序。我目前正在尝试使用变量从带有场景大纲的字段中抓取。
我的代码看起来像这样 功能文件中的 特征:股票投资组合 为了看看拥有什么股票 作为用户 我想显示我的投资组合
Scenario: User Is On Home Page
Given that I am logged in
When print current URL
Then I should see "Portfolio"
Scenario Outline: User Buys Stock
Given that I am logged in
And I own <start> "AAPL" stocks
When I fill in "ticker" with "AAPL"
And I sell <sell> stock
Then I should own <finish> "AAPL" stocks
Examples:
| start | sell | finish |
| 13 | 5 | 8 |
| 10 | 3 | 7 |
php文件中的
/**
* @Then /^I should own (.*) "([^"]*)" stocks$/
*/
public function iShouldOwnStocks($start, $arg1)
{
$this->assertSession()->fieldValueEquals($arg1, $start);
}
/**
* @Given /^I sell (.*) stock$/
*/
public function iSellStock($sell)
{
$this->fillField("quantity", $sell);
}
/**
* @Given /^I own (.*) "([^"]*)" stocks$/
*/
public function iOwnStocks($start, $arg1)
{
$this->assertSession()->fieldValueEquals($arg1, $start);
}
我不断得到的错误是:
我不太确定这里发生了什么 - 帮助会非常感激!
答案 0 :(得分:1)
首先,关于正则表达式:
不要使用(.*)
,除非它在步骤定义的最后,作为一个有用的提示,或其他开发人员稍后修复错误。这个正则表达式的字面意思是,接受除新行之外的任何字符。
相反,请使用仅接受数字的([0-9]+)
或([\d]+)
,这只会接受数字,并且只有在有1或更多时才会接受数字。
其次,关于正则表达式:
尝试使用双引号"([0-9]+)"
或"([\d]+)"
封装数字,这应该与上面相同,但只允许使用引号中的数字,使其更加清晰。
倒数第二,关于正则表达式
如果您仍然遇到数字问题,由于小数位,请使用:
"([\d])*\.?([\d]){0,2}"
将捕获任意数量的数字,可选的小数位数,以及最多两个数字。
最后,关于功能重复
你在两个单独的步骤定义中两次断言同样的事情。 就个人而言,我会改变
/**
* @Then /^I should own (.*) "([^"]*)" stocks$/
*/
public function iShouldOwnStocks($start, $arg1)
{
$this->assertSession()->fieldValueEquals($arg1, $start);
}
功能
/**
* @Then /^I (?:|should )own "([0-9]+)" "([^"]*)" stocks$/
*/
public function iShouldOwnStocks($start, $arg1)
{
$this->assertSession()->fieldValueEquals($arg1, $start);
}
这将使&#34;应该&#34;可选的,意味着不需要重复相同的断言,使您的上下文变得更加混乱。
基本上,你将不再需要这个:
/**
* @Given /^I own (.*) "([^"]*)" stocks$/
*/
public function iOwnStocks($start, $arg1)
{
$this->assertSession()->fieldValueEquals($arg1, $start);
}
如果在我建议的正则表达式修复后仍然存在问题,请发表评论,我将尝试在新段落中回答。