我相信我不清楚BehatContext和MinkContext,我不确定为什么我会在我的应用程序中继承其中一个。基本上我不清楚为什么我必须在每个函数中实例化一个新的Client对象。我应该可以使用$ this,因为我在我的behat.yml文件中加载了goutte。
请提示?
<?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 //MinkContext if you want to test web
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('behat', new BehatContext);
$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;
}
/**
* @Given /^I am on homepage$/
*/
public function iAmOnHomepage()
{
// $this->getSession()->visit("/");
$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)
{
$client = new Client();
$crawler = $client->request('GET', 'http://local.referral.com/');
$link = $crawler->selectLink('Register')->link();
$crawler = $client->click($link);
}
/**
* @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();
}
}
答案 0 :(得分:3)
我相信我不清楚BehatContext和MinkContext,我不确定为什么我会在我的应用程序中继承其中一个。
BehatContext
是一个基本的上下文,对于大多数自己的上下文来说都是默认选择。
MinkContext
是一个专门的上下文,可让您访问Mink会话。它还包含一些基本的步骤定义。这就是为什么你永远不应该扩展它(因为你只能扩展它一次,因为步骤定义不能重复)。
如果您需要访问Mink会话,请扩展RawMinkContext
。这就像没有步骤定义的MinkContext
。
基本上我不清楚为什么我必须在每个函数中实例化一个新的Client对象。我应该可以使用$ this,因为我在我的behat.yml文件中加载了goutte。
您为什么要尝试自己实例化客户端?只需使用Mink Session,它将为您完成:
<?php
namespace Main\ReferralCaptureBundle\Features\Context;
// your use statements here...
class FeatureContext extends RawMinkContext
{
/**
* @Given /^I am on homepage$/
*/
public function iAmOnHomepage()
{
$session = $this->getSession();
$session->visit($this->locatePath('/'));
$link = $session->getPage()->findLink('I am a Physician');
if (null === $link) {
throw new Exception("Home Page Not Loaded:\n");
}
}
/**
* @Given /^I follow "([^"]*)"$/
*/
public function iFollow($arg1)
{
$link = $this->getSession()->findLink('Register');
if (null === $link) {
throw new \LogicException('Could not find the "Register" link');
}
$link->click();
}
// ...
}
查看MinkContext
中的步骤定义以获取灵感。
阅读(严肃地说,首先阅读文档):