我正在努力将Behat 3纳入基于Laravel的新API,并且我使用lucadegasperi / oauth2-server-laravel包来处理身份验证。
有时间让Behat设置正常工作(现在是)。我不明白为什么,但似乎我需要在beforeSuite和beforeFeature钩子中迁移包。看起来很傻,因为我只需要在所有功能运行之前迁移一次..?
我想在套件加载之前只迁移一次,否则随着测试次数的增加,运行时间可能会变长。
我一直在攻击Behat 2 *的示例,以便在第3版中工作。
我的FeatureContext类目前看起来像这样:
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
/**
* Behat context class.
*/
class FeatureContext implements SnippetAcceptingContext
{
private $_restObject = null;
private $_restObjectType = null;
private $_restObjectMethod = 'get';
private $_client = null;
private $_response = null;
private $_requestUrl = null;
private $_baseUrl = null;
/**
* 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($baseUrl)
{
$this->_restObject = new stdClass();
$this->_client = new GuzzleHttp\Client();
$this->_baseUrl = $baseUrl;
}
/**
* @static
* @beforeSuite
*/
public static function bootstrapLaravel()
{
$unitTesting = true;
$testEnvironment = 'testing';
// This assumes the FeatureContext.php class is within app/tests/features/bootstrap
$app = require_once __DIR__.'/../../../../bootstrap/start.php';
$app->boot();
Mail::pretend(true);
}
/**
* @static
* @beforeSuite
*/
public static function setUpDb()
{
Artisan::call('migrate');
self::migratePackages();
/* do seeding */
$seeders = array(
"OAuthTestSeeder",
"RolesPermissionsSeeder"
);
foreach ($seeders as $seedClass)
{
Artisan::call("db:seed", array("--class" => $seedClass));
}
}
/**
* @static
* @beforeFeature
*/
public static function prepDb()
{
Artisan::call('migrate:refresh');
self::migratePackages();
Artisan::call('db:seed');
}
public static function migratePackages()
{
$packages = array(
"lucadegasperi/oauth2-server-laravel",
);
foreach ($packages as $packageName)
{
Artisan::call("migrate",
array("--package" => $packageName, "--env" => "testing"));
echo 'migrating package: '.$packageName;
}
}
/* feature specs here...
*/
}
答案 0 :(得分:2)
是的,文档和示例不是Behat最强大的部分,但不要害怕。与其他一些测试软件不同,当你加载整个东西时,Behat没有为你提供运行引导程序的单一选项,尽管它提供了许多其他很酷的功能。你几乎走在正确的道路上。您需要做的就是有一个静态标志,指示引导程序是否完成了工作。在我的例子中,我通过添加存储状态值的TestUtility
类和每个上下文中包含的SetUpTrait来完成这项工作。
final class TestUtility extends AbstractUtility
{
protected static $bootstrapped = false;
public static function isBootstrapped()
{
return self::$bootstrapped;
}
public static function bootstrap()
{
if (self::isBootstrapped()) {
return;
}
include_once(__DIR__ . './../bootstrap.php');
self::$bootstrapped = true;
}
}
trait SetUpTrait
{
public static function setUpSuite(BeforeSuiteScope $scope)
{
TestUtility::bootstrap();
}
}
class My extends RawMinkContext
{
use SetUpTrait;
}
我设法为应用程序本身,PHPUnit和Behat测试设置应用程序以使用单个引导程序文件。它带有一些额外的代码行,但是所有内容都有一个条目,并且它非常容易维护 - 比使用3个引导文件更容易。