我正在尝试在遗留 Symfony 2.8 项目中使用Liip 的 FunctionalTestBundle实现功能测试。
这个项目在存储库等中使用手写的 postgresql 查询,所以我不能强制使用 sqlite。根据捆绑包的文档,我必须自己在测试设置中创建模式。我尝试使用文档中提供的代码片段。
public function setUp()
{
$em = $this->getContainer()->get('doctrine')->getManager();
if (!isset($metadatas)) {
$metadatas = $em->getMetadataFactory()->getAllMetadata();
}
$schemaTool = new SchemaTool($em);
$schemaTool->dropDatabase();
if (!empty($metadatas)) {
$schemaTool->createSchema($metadatas);
}
$this->postFixtureSetup();
}
这失败$schemaTool->createSchema($metadatas);
并出现以下错误:
SQLSTATE[42P06]: Duplicate schema: 7 ERROR: schema "app" already exists' while executing DDL: CREATE SCHEMA app
/path/to/project/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/ToolsException.php:39
/path/to/project/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/SchemaTool.php:96
我的配置如下:
# /path/to/project/app/config/config_test.yml
doctrine:
dbal:
default_connection: airlinesManager
connections:
airlinesManager:
driver: pdo_pgsql
memory: true
path: "%kernel.cache_dir%/test.db"
依赖项:
# /path/to/project/composer.json
{
[...]
"require": {
"php": "^7.1",
"symfony/symfony": "2.8.*",
"doctrine/orm": "^2.4.8",
"doctrine/doctrine-bundle": "~1.4",
"doctrine/common": "2.*",
"doctrine/dbal": "2.*",
"doctrine/doctrine-fixtures-bundle": "2.*",
[...]
},
"require-dev": {
[...],
"liip/functional-test-bundle": "^1.10"
},
[...]
}
如果我将我的配置更改为driver: pdo_sqlite
并删除 setUp 片段,只要涉及固定装置,一切都会正常工作。但是当测试开始使用一些手写的 postgresql 查询时,我开始收到错误。
有什么想法可以使架构工作吗?
注意:由于某些原因,我无法从 symfony 控制台进行任何数据库操作。这是尝试删除数据库时的示例。
php app/console doctrine:database:drop --force --env="test"
我总是得到同样的错误。
Could not drop database for connection named /path/to/project/app/cache/test/test.db
An exception occurred while executing 'DROP DATABASE /path/to/project/app/cache/test/test.db':
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "/"
LINE 1: DROP DATABASE /path/to/project/...
再说一次,这在使用 sqlite 时效果很好。