"所选节点没有表格祖先"

时间:2016-03-19 22:12:14

标签: php behat gherkin mink

我正在使用Behat + Mink测试我的PHP / bootstrap应用程序。我目前正在尝试使用变量从带有场景大纲的字段中抓取。

网站看起来像这样 enter image description here

我的代码看起来像这样 功能文件中的     特征:股票投资组合         为了看看拥有什么股票         作为用户         我想显示我的投资组合

    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);

    }

我不断得到的错误是:

Error

我不太确定这里发生了什么 - 帮助会非常感激!

1 个答案:

答案 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);

}

如果在我建议的正则表达式修复后仍然存在问题,请发表评论,我将尝试在新段落中回答。