我有一个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的情况下运行。
答案 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);
}
}