Behat и Symfony данные светильники
Мне интересно, можно ли использовать отдельную базу данных для Behat тесты? есть ли способ удалить и усечь базу данных и загрузить с ней данные, как вы можете сделать с PHPUnit?
2 ответов
вы можете создать новая среда (например, test, dev и prod) и настройте его предпочтительным способом.
в качестве примера для настройки behat env выполните следующие действия:
- создайте новый файл в веб-папке с именем web_behat.php
- определение config_behat.ymlв папке config
- настройка параметров в parameters_behat.yml
затем
- используйте этот env в тесте behat, где вы можете загрузить свои светильники и т. д.
Я не знаю, как вы можете настроить свои светильники в сценарии behat, но только в качестве примера вы можете сделать что-то подобное в командной строке:
php app/console doctrine:fixture:load --env=behat
ШАГ
- создайте новый файл в веб-папке с именем 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);
определите config_behat.YML в разделе app/config папка, в которой вы вспоминаете свои пользовательские параметры с нужными конфигурациями (база данных, электронная почта и т. д.) Что-то вроде этого:
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 и вставьте container + entity manager в контекст функции (или просто контейнер и загрузите его оттуда). Нерелевантные настройки не отображаются.
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).
<?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);
    }
}
