yaboroda / ybsy-test-helper-bundle
此包提供与测试数据库一起简化单元测试的工具
1.1.1
2018-06-08 07:03 UTC
Requires
- php: >=5.6
- doctrine/doctrine-bundle: ~1.4
- doctrine/doctrine-fixtures-bundle: ^2.
- doctrine/orm: ^2.4.8
- phpunit/phpunit: ^5.7
- symfony/symfony: 2.8.*
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);