如何将Laravel实现与Behat和Mockery交换

时间:2015-07-01 09:45:12

标签: 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

有人知道在运行Behat时交换Laravel实现的方法吗?

我需要这个的原因是因为数据来自远程API,我希望测试能够在不需要API的情况下运行。

1 个答案:

答案 0 :(得分: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);
    }
}