【问题标题】:Behat and Symfony data fixturesBehat 和 Symfony 数据夹具
【发布时间】:2015-03-05 11:38:48
【问题描述】:

我想知道是否可以为 Behat 测试使用单独的数据库?有什么方法可以像使用 PHPUnit 一样删除和截断数据库并使用它加载数据固定装置?

【问题讨论】:

  • 您应该使用pdo_sqlite 用于隔离测试环境,而不是MySQL。您的 sqlite DB 文件将存储在%kernel.cache_dir%/hello.db 下。根据您的测试环境配置,可以在以下位置找到它:app/cache/test/hello.db。 Sqlite 也会提供更好的性能。我会尽量给你举个例子!

标签: php symfony phpunit fixtures behat


【解决方案1】:

您可以创建一个新环境(如测试、开发和生产)并以您喜欢的方式对其进行配置。

作为配置行为环境的示例,请执行以下操作:

  1. 在名为web_behat.php 的网络文件夹中创建一个新文件
  2. 在配置文件夹中定义config_behat.yml
  3. parameters_behat.yml 中自定义您的参数

然后

  1. 在您的行为测试中使用此环境,您可以在其中加载您的固定装置等

我不知道您是否可以在行为场景中设置您的灯具,但仅作为示例您可以在命令行中执行以下操作:

php app/console doctrine:fixture:load --env=behat

详细步骤

  1. 在 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:

希望有帮助

【讨论】:

    【解决方案2】:

    在您的行为中设置自定义环境,并将容器 + 实体管理器注入功能上下文(或只是容器并从那里加载)。不相关的设置未显示。

    Behat.yml

    default:
      suites:
        default:
          contexts:
          - FeatureContext:
              container: '@service_container'
              entityManager: "@doctrine.orm.default_entity_manager"
      extensions:
        Behat\Symfony2Extension:
          kernel:
            env: "test"
    

    FeatureContext

    请务必用您的($loader-&gt;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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多