Behat 和 Symfony 数据装置
Behat and Symfony data fixtures
我想知道是否可以为 Behat 测试使用单独的数据库?有什么方法可以像使用 PHPUnit 那样删除和截断数据库并使用它加载数据固定装置吗?
您可以创建一个新环境(如测试、开发和生产)并以您喜欢的方式配置它。
作为配置 behat 环境的示例,请执行以下操作:
- 在名为
web_behat.php
的 Web 文件夹中创建一个新文件
- 在config文件夹中定义一个
config_behat.yml
- 在
parameters_behat.yml
中自定义您的参数
然后
- 在你的 behat 测试中使用这个环境,你可以在其中加载你的固定装置等
我不知道你可以在 behat 场景中设置你的固定装置,但仅作为示例,你可以在命令行中执行类似的操作:
php app/console doctrine:fixture:load --env=behat
详细步骤
- 在 web 文件夹中创建一个名为 web_behat.php 的新文件(从 web_dev.php 复制并删除 ip 限制)取决于您的 sf2 版本但是:
web_behat.php
<?php
use Symfony\Component\ClassLoader\ApcClassLoader;
use Symfony\Component\HttpFoundation\Request;
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order to prevent key conflict with another application
/*
$loader = new ApcClassLoader('sf2', $loader);
$loader->register(true);
*/
require_once __DIR__.'/../app/AppKernel.php';
$kernel = new AppKernel('behat', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
在 app/config
文件夹下定义一个 config_behat.yml,您可以在其中调用具有所需配置(数据库、电子邮件等)的自定义参数,如下所示:
config_behat.yml
imports:
- { resource: config.yml }
- { resource: parameters_behat.yml }
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
assetic:
use_controller: true
framework:
test: ~
parameters:
router.options.matcher.cache_class: ~ # disable router cache
router.options.matcher_class: Symfony\Component\Routing\Matcher\ApacheUrlMatcher
parameters_behat.yml
parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: ~
database_name: test_behat
database_user: root
database_password:
希望对您有所帮助
在您的行为中设置一个自定义环境,并将容器 + 实体管理器注入到功能上下文中(或者只是容器并从那里加载它)。不显示不相关的设置。
Behat.yml
default:
suites:
default:
contexts:
- FeatureContext:
container: '@service_container'
entityManager: "@doctrine.orm.default_entity_manager"
extensions:
Behat\Symfony2Extension:
kernel:
env: "test"
FeatureContext
一定要用你的(在 $loader->loadFromDirectory
中)替换 fixtures 路径。
<?php
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext
{
/**
* @var ContainerInterface
*/
private $container;
/**
* @var EntityManager
*/
private $em;
/**
* FeatureContext constructor.
* @param ContainerInterface $container
* @param EntityManager $entityManager
*/
public function __construct(ContainerInterface $container, EntityManager $entityManager)
{
$this->container = $container;
$this->em = $entityManager;
$this->setupDatabase();
$this->loadFixtures();
}
protected function setupDatabase()
{
$metaData = $this->em->getMetadataFactory()->getAllMetadata();
$schemaTool = new SchemaTool($this->em);
$schemaTool->dropDatabase();
if (!empty($metaData)) {
$schemaTool->createSchema($metaData);
}
}
protected function loadFixtures()
{
$loader = new ContainerAwareLoader($this->container);
$loader->loadFromDirectory(__DIR__ . '/../../src/AppBundle/DataFixtures');
$executor = new ORMExecutor($this->em);
$executor->execute($loader->getFixtures(), true);
}
}
我想知道是否可以为 Behat 测试使用单独的数据库?有什么方法可以像使用 PHPUnit 那样删除和截断数据库并使用它加载数据固定装置吗?
您可以创建一个新环境(如测试、开发和生产)并以您喜欢的方式配置它。
作为配置 behat 环境的示例,请执行以下操作:
- 在名为
web_behat.php
的 Web 文件夹中创建一个新文件
- 在config文件夹中定义一个
config_behat.yml
- 在
parameters_behat.yml
中自定义您的参数
然后
- 在你的 behat 测试中使用这个环境,你可以在其中加载你的固定装置等
我不知道你可以在 behat 场景中设置你的固定装置,但仅作为示例,你可以在命令行中执行类似的操作:
php app/console doctrine:fixture:load --env=behat
详细步骤
- 在 web 文件夹中创建一个名为 web_behat.php 的新文件(从 web_dev.php 复制并删除 ip 限制)取决于您的 sf2 版本但是:
web_behat.php
<?php
use Symfony\Component\ClassLoader\ApcClassLoader;
use Symfony\Component\HttpFoundation\Request;
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order to prevent key conflict with another application
/*
$loader = new ApcClassLoader('sf2', $loader);
$loader->register(true);
*/
require_once __DIR__.'/../app/AppKernel.php';
$kernel = new AppKernel('behat', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
在 app/config
文件夹下定义一个 config_behat.yml,您可以在其中调用具有所需配置(数据库、电子邮件等)的自定义参数,如下所示:
config_behat.yml
imports:
- { resource: config.yml }
- { resource: parameters_behat.yml }
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
assetic:
use_controller: true
framework:
test: ~
parameters:
router.options.matcher.cache_class: ~ # disable router cache
router.options.matcher_class: Symfony\Component\Routing\Matcher\ApacheUrlMatcher
parameters_behat.yml
parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: ~
database_name: test_behat
database_user: root
database_password:
希望对您有所帮助
在您的行为中设置一个自定义环境,并将容器 + 实体管理器注入到功能上下文中(或者只是容器并从那里加载它)。不显示不相关的设置。
Behat.yml
default:
suites:
default:
contexts:
- FeatureContext:
container: '@service_container'
entityManager: "@doctrine.orm.default_entity_manager"
extensions:
Behat\Symfony2Extension:
kernel:
env: "test"
FeatureContext
一定要用你的(在 $loader->loadFromDirectory
中)替换 fixtures 路径。
<?php
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines application features from the specific context.
*/
class FeatureContext extends MinkContext
{
/**
* @var ContainerInterface
*/
private $container;
/**
* @var EntityManager
*/
private $em;
/**
* FeatureContext constructor.
* @param ContainerInterface $container
* @param EntityManager $entityManager
*/
public function __construct(ContainerInterface $container, EntityManager $entityManager)
{
$this->container = $container;
$this->em = $entityManager;
$this->setupDatabase();
$this->loadFixtures();
}
protected function setupDatabase()
{
$metaData = $this->em->getMetadataFactory()->getAllMetadata();
$schemaTool = new SchemaTool($this->em);
$schemaTool->dropDatabase();
if (!empty($metaData)) {
$schemaTool->createSchema($metaData);
}
}
protected function loadFixtures()
{
$loader = new ContainerAwareLoader($this->container);
$loader->loadFromDirectory(__DIR__ . '/../../src/AppBundle/DataFixtures');
$executor = new ORMExecutor($this->em);
$executor->execute($loader->getFixtures(), true);
}
}