yaboroda/ybsy-test-helper-bundle

此包提供与测试数据库一起简化单元测试的工具

安装: 26

依赖: 0

建议者: 0

安全: 0

类型:symfony-bundle

1.1.1 2018-06-08 07:03 UTC

This package is auto-updated.

Last update: 2020-08-08 13:27:01 UTC


README

此包适用于 symfony 2.8,可以帮助配置使用 sqlite 测试数据库的模块化测试。
由于使用 sqlite,它将数据库存储在文件中,因此不需要在服务器上配置额外的数据库。
在测试每个类之前,数据库将从头开始使用固定值创建,然后数据文件被复制到临时文件中。在每次测试之前,数据库不是从固定值中填充,而是从临时文件中恢复。这可以在执行测试时节省大量时间。

要求

  • php 5.6
  • php pdo_mysql 扩展
  • symfony 2.8
  • phpunit 5.7
  • doctrine 1.4
  • doctrine-fixtures-bundle 2.*

安装

$ composer require yaboroda/ybsy-test-helper-bundle

配置

在文件 app/config_test.yml 中

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_sqlite
                path:     %kernel.cache_dir%/test.db

使用

将测试类继承自 YaBoroda\TestHelperBundle\Tests\TestHelper

<?php 
namespace AppBundle\Tests\Service;

use YaBoroda\TestHelperBundle\Tests\TestHelper;
use AppBundle\Service\BaseService;

class BaseServiceTest extends TestHelper
{
    // Метод вызывается перед первым тестом класса
    public static function setUpBeforeClass()
    {
        self::$fixturesDir = 'src/AppBundle/DataFixtures/ORM/';
        self::prepareTestDatabase();
    }
    
    public static function testGettingService()
    {
        $baseService = $this->getContainer()->get('baseService');
        $this->assertInstanceOf(BaseService::class, $baseService);
    }
}

如果需要在每个测试之前执行某些操作,则重写 setUp() 方法,但不要忘记调用父方法

    public function setUp()
    {
        parent::setUp();
        // дальше ваш код
    }

如果需要修改容器,则可以重写 getContainer() 方法;此容器将在 getEntityManager() 和 getQueryBuilder() 方法中使用
之后,使用 getRealContainer() 方法获取未修改的容器


    protected function getContainer()
    {
        $container = $this->getRealContainer();

        // тут делайте с ним что хотите

        return $container;
    }

使用固定值

  • 在 self::$fixturesDir 中设置固定值目录,相对于项目根目录
  • self::prepareTestDatabase() 方法创建数据库模式并填充固定值,参数为固定值文件的名称或名称数组
  • 不传递参数时,固定值将在 DefaultFixture.php 文件中查找
  • 可以传递包含文件名的数组,第一个文件将按常规顺序填充,其余文件将按追加模式填充,因此数据库将包含所有传递的固定值中的信息

如果您不需要数据库,可以取消固定值的填充和测试之间的数据库回滚,以节省时间。

    public static function setUpBeforeClass()
    {
        ;
    }

    public function setUp()
    {
        // если сервис контейнер вам все-таки нужен, вызовите тут инициацию окружения
        $this->setUpApplication();
    }

工具

获取容器

$container = $this->getContainer();

获取 EntityManager

$em = $this->getEntityManager();

获取 QueryBuilder

$qb = $this->getQueryBuilder();

授权用户(传递 NULL 获取匿名授权)
第二个参数是 security.yml 中的防火墙名称
默认为 'secured_area',因此如果您使用相同的名称,则可以不传递第二个参数

$this->authorizeUser($user, $firewall);

获取对象的受保护或私有属性

$prop = $this->getProtectedProperty($object, $propertyName);

执行对象的受保护或私有方法

$result = $this->callProtectedMethod($object, $methodName, array($param1, $param2));

为容器设置 request scope(对于某些操作是必需的)

$this->setRequestScopeToContainer($container);

// если вторым параметром передать объект Request, то он добавится в стек реквестов
$this->setRequestScopeToContainer($container, $request);

// пустой Request можно получить тут же, модифицировать его и потом установить в контейнер
$request = $this->getEmptyRequest();

这些方法用于管理数据库文件,通常不需要直接调用它们,但在某些情况下可能很有用

// загрузить файл фикстур с очисткой БД
self::loadFixtures($fileName);

// добавить данные из фикстур к БД
self::appendFixtures($fileName);

// скопировать текущий файл БД во временный (если имя файла не передавать, то скопируется в test.db.bk)
self::backupDatabase($fileName);

// скопировать сохраненный ранее файл БД на место текущего (если имя файла не передавать, то скопируется из test.db.bk)
$this->restoreDatabase($fileName);