Behat и данные Symfony

Мне интересно, можно ли использовать отдельную базу данных для тестов Behat? Есть ли способ отбросить и обрезать базу данных и загрузить данные фикстуры с ним, как вы можете сделать с помощью PHPUnit?

7

Решение

Вы можете создать новая среда (например, test, dev и prod) и настройте его по своему усмотрению.

В качестве примера для настройки окружающей среды behat, сделайте следующее:

  1. создать новый файл в веб-папке с именем web_behat.php
  2. определить config_behat.yml в папке config
  3. настроить параметры в parameters_behat.yml

затем

  1. Используйте этот env в своем тесте behat, где вы можете загрузить свои приборы и т. Д.

Я не знаю, как вы можете настроить свои приборы в сценарии behat, но только в качестве примера вы можете сделать что-то подобное в командной строке:

php app/console doctrine:fixture:load --env=behat
  1. Создание нового файла в веб-папке с именем 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:

Надеюсь это поможет

4

Другие решения

Установите пользовательскую среду в своем списке и вставьте контейнер + менеджер сущностей в контекст объекта (или просто в контейнер и загрузите его оттуда). Неактуальные настройки не отображаются.

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);
}
}
1

По вопросам рекламы [email protected]