Question

I believe I am not clear on BehatContext versus MinkContext and am not sure why I would inherit from one or the other in my app. Basically I am not clear on why I have to instantiate a new Client object in every function. I should be able to use $this since I have goutte loaded in my behat.yml file.

Any tips please?

<?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();
    }






}
Was it helpful?

Solution

I believe I am not clear on BehatContext versus MinkContext and am not sure why I would inherit from one or the other in my app.

BehatContext is a basic context which would be a default choice for most of your own contexts.

MinkContext is a specialized context giving you access to the Mink session. It also contains some basic step definitions. That's why you should never extend it ('cause you'd be only able to extend it once, since step definitions cannot be duplicated).

If you need to access the Mink Session extend the RawMinkContext. It's like the MinkContext without step definitions.

Basically I am not clear on why I have to instantiate a new Client object in every function. I should be able to use $this since I have goutte loaded in my behat.yml file.

Why are you trying to instantiate the Client yourself? Just use the Mink Session, which will do it for you:

<?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();                    
    }

     // ...   
}

Look at the step definitions in the MinkContext for inspiration.

To read (seriously, read the docs first):

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top