"step already defined" 当我尝试使用 MinkContext 扩展 Behat FeatureContext 时出错
"step already defined" errors when I try to extend Behat FeatureContext with MinkContext
我是 Behat 和 Mink 的新手,我正在尝试使用 MinkContext 扩展 FeatureContext,但是当我这样做时,每一步都会抛出一个错误,指出在 MinkContext 中定义的第一个函数也在 FeatureContext 中定义(它不是)。报错信息如下:
Step "/^(?:|I )am on (?:|the )homepage$/"
is already defined in FeatureContext::iAmOnHomepage()
如果我从 class 中删除第一个函数,每一步都会抛出相同的错误,但现在它引用 MinkContext 中的第二个函数 class:
Step "/^(?:|I )am on "(?P<page>[^"]+)"$/"
is already defined in FeatureContext::visit()
使用 RawMinkContext 扩展 FeatureContext 工作正常。
可能是什么原因造成的?
---- 编辑(附加信息)------------
我正在使用 Behat 3。
这是我当前的全部 FeatureContext.php,但我仍然遇到错误。我搜索了包含我的 Behat 安装的整个文件夹,但我只能找到一个
<?php
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext implements SnippetAcceptingContext
{
/**
* Initializes context.
*
* Every scenario gets its own context instance.
* You can also pass arbitrary arguments to the
* context constructor through behat.yml.
*/
public function __construct()
{
date_default_timezone_set("US/Eastern");
}
}
这是我的 behat.yml 文件:
# behat.yml
default:
extensions:
Behat\MinkExtension:
goutte: ~
selenium2: ~
base_url: https://harvest.cals.ncsu.edu/
suites:
default:
contexts:
- FeatureContext
- Behat\MinkExtension\Context\MinkContext
这是 MinkContext.php 的顶部:
命名空间 Behat\MinkExtension\Context;
use Behat\Behat\Context\TranslatableContext;
use Behat\Gherkin\Node\TableNode;
/**
* Mink context for Behat BDD tool.
* Provides Mink integration and base step definitions.
*
* @author Konstantin Kudryashov <ever.zet@gmail.com>
*/
class MinkContext extends RawMinkContext implements TranslatableContext
{
/**
* Opens homepage
* Example: Given I am on "/"
* Example: When I go to "/"
* Example: And I go to "/"
*
* @Given /^(?:|I )am on (?:|the )homepage$/
* @When /^(?:|I )go to (?:|the )homepage$/
*/
public function iAmOnHomepage()
{
$this->visitPath('/');
}
...
--- 编辑 2:工作版本 ----------
FeatureContext.php:
<?php
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;
use Behat\Mink\WebAssert;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext implements Context, SnippetAcceptingContext
{
...
behat.yml(现在使用 Selenium 标签 enable Chrome)
# behat.yml
default:
extensions:
Behat\MinkExtension:
goutte: ~
selenium2:
wd_host: "http://127.0.0.1:4444/wd/hub"
# chrome
capabilities: { "browserName": "chrome", "browser": "chrome", "version": "25", 'chrome': {'switches':['--no-sandbox']}}
base_url: https://harvest.cals.ncsu.edu/
browser_name: chrome
suites:
default:
contexts:
- FeatureContext
似乎 MinkContext 被加载了两次:在 FeatureContext 和 behat.yml
如果您从 behat.yml 中删除 MinkContex,它应该可以工作。
我是 Behat 和 Mink 的新手,我正在尝试使用 MinkContext 扩展 FeatureContext,但是当我这样做时,每一步都会抛出一个错误,指出在 MinkContext 中定义的第一个函数也在 FeatureContext 中定义(它不是)。报错信息如下:
Step "/^(?:|I )am on (?:|the )homepage$/"
is already defined in FeatureContext::iAmOnHomepage()
如果我从 class 中删除第一个函数,每一步都会抛出相同的错误,但现在它引用 MinkContext 中的第二个函数 class:
Step "/^(?:|I )am on "(?P<page>[^"]+)"$/"
is already defined in FeatureContext::visit()
使用 RawMinkContext 扩展 FeatureContext 工作正常。
可能是什么原因造成的?
---- 编辑(附加信息)------------
我正在使用 Behat 3。
这是我当前的全部 FeatureContext.php,但我仍然遇到错误。我搜索了包含我的 Behat 安装的整个文件夹,但我只能找到一个
<?php
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext implements SnippetAcceptingContext
{
/**
* Initializes context.
*
* Every scenario gets its own context instance.
* You can also pass arbitrary arguments to the
* context constructor through behat.yml.
*/
public function __construct()
{
date_default_timezone_set("US/Eastern");
}
}
这是我的 behat.yml 文件:
# behat.yml
default:
extensions:
Behat\MinkExtension:
goutte: ~
selenium2: ~
base_url: https://harvest.cals.ncsu.edu/
suites:
default:
contexts:
- FeatureContext
- Behat\MinkExtension\Context\MinkContext
这是 MinkContext.php 的顶部: 命名空间 Behat\MinkExtension\Context;
use Behat\Behat\Context\TranslatableContext;
use Behat\Gherkin\Node\TableNode;
/**
* Mink context for Behat BDD tool.
* Provides Mink integration and base step definitions.
*
* @author Konstantin Kudryashov <ever.zet@gmail.com>
*/
class MinkContext extends RawMinkContext implements TranslatableContext
{
/**
* Opens homepage
* Example: Given I am on "/"
* Example: When I go to "/"
* Example: And I go to "/"
*
* @Given /^(?:|I )am on (?:|the )homepage$/
* @When /^(?:|I )go to (?:|the )homepage$/
*/
public function iAmOnHomepage()
{
$this->visitPath('/');
}
...
--- 编辑 2:工作版本 ----------
FeatureContext.php:
<?php
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;
use Behat\Mink\WebAssert;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext implements Context, SnippetAcceptingContext
{
...
behat.yml(现在使用 Selenium 标签 enable Chrome)
# behat.yml
default:
extensions:
Behat\MinkExtension:
goutte: ~
selenium2:
wd_host: "http://127.0.0.1:4444/wd/hub"
# chrome
capabilities: { "browserName": "chrome", "browser": "chrome", "version": "25", 'chrome': {'switches':['--no-sandbox']}}
base_url: https://harvest.cals.ncsu.edu/
browser_name: chrome
suites:
default:
contexts:
- FeatureContext
似乎 MinkContext 被加载了两次:在 FeatureContext 和 behat.yml 如果您从 behat.yml 中删除 MinkContex,它应该可以工作。