Что не так с моим FeatureContext?

Я считаю, что не совсем понимаю 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();
    }






}

person milof    schedule 14.08.2013    source источник


Ответы (1)


Я считаю, что не совсем понимаю BehatContext по сравнению с MinkContext, и не уверен, почему я буду наследовать от одного или другого в своем приложении.

BehatContext — это базовый контекст, который будет использоваться по умолчанию для большинства ваших собственных контекстов.

MinkContext — это специальный контекст, дающий вам доступ к сеансу Mink. Он также содержит некоторые основные определения шагов. Вот почему вы никогда не должны расширять его (потому что вы сможете расширить его только один раз, поскольку определения шагов не могут быть продублированы).

Если вам нужен доступ к сеансу Mink, расширьте файл RawMinkContext. Это как MinkContext без определения шагов.

В основном я не понимаю, почему я должен создавать новый объект Client в каждой функции. Я должен иметь возможность использовать $this, поскольку в моем файле behat.yml загружен goutte.

Почему вы пытаетесь создать экземпляр клиента самостоятельно? Просто используйте сеанс Mink, который сделает это за вас:

<?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 для вдохновения.

Чтобы прочитать (серьезно, сначала прочитайте документы):

person Jakub Zalas    schedule 14.08.2013
comment
Я все еще получаю: Неоднозначное совпадение Я на главной странице: ошибка, когда я следую вашему примеру - person milof; 14.08.2013
comment
Таким образом, у вас все еще есть повторяющееся определение шага (обратите внимание, что первое — я на главной странице — такое же, как и в MinkContext). - person Jakub Zalas; 14.08.2013
comment
аааа, это сработало после того, как я удалил $this-›useContext('mink', new MinkContext); из __конструкции. Спасибо чувак! - person milof; 14.08.2013