Как поменять местами реализацию Laravel с Behat и Mockery

У меня есть Behat FeatureContext, для которого я хочу поменять реализацию Laravel данного класса на издевательскую.

поэтому у меня есть этот метод с аннотацией @beforeSuite

/**
     * @static
     * @beforeSuite
     */
    public static function mockData()
    {
        $unitTesting = true;
        $testEnvironment = 'acceptance';

        $app = require_once __DIR__.'/../../../bootstrap/start.php';
        $app->boot();

        $fakeDataRetriever = m::mock('My\Data\Api\Retriever');


        $fakeData = [
           'fake_name' => 'fake_value'
        ];

        $fakeDataRetriever->shouldReceive('getData')->andReturn($fakeData);

        $app->instance('My\Data\Api\Retriever', $fakeDataRetriever);

    }

Итак, я вижу, что приложение Laravel и поддельные данные меняются местами, но когда я запускаю Behat, оно игнорируется, что означает, что Laravel использует реальную реализацию вместо поддельной.

Я использую Laravel 4.2

Кто-нибудь знает способ поменять местами реализации Laravel при запуске Behat?

Причина, по которой мне это нужно, заключается в том, что данные поступают из удаленного API, и я хочу, чтобы тест выполнялся без обращения к API.


person askask    schedule 01.07.2015    source источник
comment
Где вы используете My\Data\Api\Retriever, вы вводите его?   -  person user1669496    schedule 01.07.2015
comment
да, я ввожу его в контроллер, на который попадает тест   -  person askask    schedule 01.07.2015


Ответы (1)


Я не слишком знаком с Behat, за исключением того, что я только что прочитал в кратком руководстве, чтобы узнать, могу ли я помочь найти здесь... http://code.tutsplus.com/tutorials/laravel-bdd-and-you-lets-get-started--cms-22155

Похоже, вы создаете новый экземпляр Laravel, устанавливаете в нем реализацию экземпляра, а затем ничего не делаете с экземпляром Laravel. Что, вероятно, произойдет дальше, так это среда тестирования, которая будет использовать свой собственный экземпляр Laravel для запуска тестов.

use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

use PHPUnit_Framework_Assert as PHPUnit;
use Symfony\Component\DomCrawler\Crawler;

use Illuminate\Foundation\Testing\ApplicationTrait;

/**
 * Behat context class.
 */
class LaravelFeatureContext implements SnippetAcceptingContext
{
    /**
     * Responsible for providing a Laravel app instance.
     */
    use ApplicationTrait;

    /**
     * Initializes context.
     *
     * Every scenario gets its own context object.
     * You can also pass arbitrary arguments to the context constructor through behat.yml.
     */
    public function __construct()
    {
    }

    /**
     * @BeforeScenario
     */
    public function setUp()
    {
        if ( ! $this->app)
        {
            $this->refreshApplication();
        }
    }

    /**
     * Creates the application.
     *
     * @return \Symfony\Component\HttpKernel\HttpKernelInterface
     */
    public function createApplication()
    {
        $unitTesting = true;

        $testEnvironment = 'testing';

        return require __DIR__.'/../../bootstrap/start.php';
    }

    /**
     * @static
     * @beforeSuite
     */
    public function mockData()
    {
        $fakeDataRetriever = m::mock('My\Data\Api\Retriever');

        $fakeData = [
            'fake_name' => 'fake_value'
        ];

        $fakeDataRetriever->shouldReceive('getData')->andReturn($fakeData);

        $this->app->instance('My\Data\Api\Retriever', $fakeDataRetriever);
    }
}
person user1669496    schedule 01.07.2015