我正在尝试在我的Symfony 2.3项目中进行BDD,并且似乎正在努力解决一些不一致问题。
根据我是否使用BehatContext或MinkContext作为FeatureContext类的基类,我得到的结果不同。
如果我使用:
class FeatureContext extends BehatContext
一切都很好。但是,如果我使用:
class FeatureContext extends MinkContext
我得到的错误使得它看起来像MinkContext不再喜欢我的正则表达式而不再是系统自己生成的。你能帮我理解一下:
FFFFFFF
(::) failed steps (::)
01. Ambiguous match of "I am on homepage":
to `/^I am on homepage$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iAmOnHomepage()
to `/^(?:|I )am on (?:|the )homepage$/` from Behat\MinkExtension\Context\MinkContext::iAmOnHomepage()
In step `Given I am on homepage'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
02. Ambiguous match of "I follow "sign up"":
to `/^I follow "([^"]*)"$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iFollow()
to `/^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/` from Behat\MinkExtension\Context\MinkContext::clickLink()
In step `And I follow "sign up"'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
03. Ambiguous match of "I fill in "username" with "email@email.com"":
to `/^I fill in "([^"]*)" with "([^"]*)"$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iFillInWith()
to `/^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/` from Behat\MinkExtension\Context\MinkContext::fillField()
In step `When I fill in "username" with "email@email.com"'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
04. Ambiguous match of "I fill in "password" with "password123"":
to `/^I fill in "([^"]*)" with "([^"]*)"$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iFillInWith()
to `/^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/` from Behat\MinkExtension\Context\MinkContext::fillField()
In step `And I fill in "password" with "password123"'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
05. Ambiguous match of "I press "register"":
to `/^I press "([^"]*)"$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iPress()
to `/^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/` from Behat\MinkExtension\Context\MinkContext::pressButton()
In step `And I press "register"'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
06. Ambiguous match of "I should see "You have successfully registered"":
to `/^I should see "([^"]*)"$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iShouldSee()
to `/^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/` from Behat\MinkExtension\Context\MinkContext::assertPageContainsText()
In step `Then I should see "You have successfully registered"'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
07. Ambiguous match of "I should be on homepage":
to `/^I should be on homepage$/` from Main\ReferralCaptureBundle\Features\Context\FeatureContext::iShouldBeOnHomepage()
to `/^(?:|I )should be on (?:|the )homepage$/` from Behat\MinkExtension\Context\MinkContext::assertHomepage()
In step `And I should be on homepage'.
From scenario `Successful registration when user provides all the required info'. # src/Main/ReferralCaptureBundle/Features/registration.feature:12
Of feature `registration'. # src/Main/ReferralCaptureBundle/Features/registration.feature
1 scenario (1 failed)
7 steps (7 failed)
FeatureContext.php
<?php
namespace Main\ReferralCaptureBundle\Features\Context;
use Main\ReferralCaptureBundle\Features\Context\FeatureContext;
use Symfony\Component\HttpKernel\KernelInterface;
use Behat\Symfony2Extension\Context\KernelAwareInterface;
use Behat\MinkExtension\Context\MinkContext;
use Behat\MinkExtension\Context\RawMinkContext;
use Behat\Behat\Context\BehatContext,
Behat\Behat\Exception\PendingException;
use Behat\Gherkin\Node\PyStringNode,
Behat\Gherkin\Node\TableNode;
use Goutte\Client;
//
// Require 3rd-party libraries here:
//
require_once 'PHPUnit/Autoload.php';
require_once 'PHPUnit/Framework/Assert/Functions.php';
//
/**
* Feature context.
*/
class FeatureContext extends RawMinkContext //WHAT TO USE HERE!!!!!!
implements KernelAwareInterface
{
private $kernel;
private $parameters;
/**
* Initializes context with parameters from behat.yml.
*
* @param array $parameters
*/
public function __construct(array $parameters)
{
$this->parameters = $parameters;
// $this->useContext('mink', new MinkContext);
}
/**
* Sets HttpKernel instance.
* This method will be automatically called by Symfony2Extension ContextInitializer.
*
* @param KernelInterface $kernel
*/
public function setKernel(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
//
// Place your definition and hook methods here:
//
// /**
// * @Given /^I have done something with "([^"]*)"$/
// */
// public function iHaveDoneSomethingWith($argument)
// {
// $container = $this->kernel->getContainer();
// $container->get('some_service')->doSomethingWith($argument);
// }
//
//
//
//
/**
* @Given /^I am on homepage$/
*/
public function iAmOnHomepage()
{
$client = new Client();
$crawler = $client->request('GET', 'http://local.referral.com/');
$link = $crawler->selectLink('I am a Physician')->link();
if (!count($link)>0)
{
throw new Exception("Home Page Not Loaded:\n");
}
}
/**
* @Given /^I follow "([^"]*)"$/
*/
public function iFollow($arg1)
{
throw new PendingException();
}
/**
* @When /^I fill in "([^"]*)" with "([^"]*)"$/
*/
public function iFillInWith($arg1, $arg2)
{
throw new PendingException();
}
/**
* @Given /^I press "([^"]*)"$/
*/
public function iPress($arg1)
{
throw new PendingException();
}
/**
* @Then /^I should see "([^"]*)"$/
*/
public function iShouldSee($arg1)
{
throw new PendingException();
}
/**
* @Given /^I should be on homepage$/
*/
public function iShouldBeOnHomepage()
{
throw new PendingException();
}
}
behat.yml
default:
formatter:
name: progress
extensions:
Behat\Symfony2Extension\Extension:
mink_driver: true
kernel:
env: test
debug: true
Behat\MinkExtension\Extension:
goutte: ~
base_url: 'http://local.mysite.com'
default_session: symfony2
答案 0 :(得分:11)
如果您需要访问Mink会话(用于浏览器自动化),请扩展RawMinkContext
。
不要直接使用Goutte。
BehatContext
是一个基本的上下文,当你不需要Mink时,它将是你自己大多数情境的默认选择。
MinkContext
是一个专门的上下文,可让您访问Mink会话(与RawMinkContext
相同)。但是,它还包含一些基本步骤定义。这就是为什么你永远不应该扩展它,而是将它用作子上下文。您只能将其扩展一次,因为步骤定义不能重复。
问题与您的其他问题非常相似(查看Mink用法示例):What is wrong with my FeatureContext?
使用Behat并不意味着您正在关注BDD 。要了解有关它的更多信息,请阅读以下书籍:
阅读有关工具的信息: