You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pimcore扩展Bundle配置PHPUnit数据库连接以支持单元测试

解决方案

报错根因

运行测试时未初始化Pimcore内核,导致\Pimcore类的静态容器属性未赋值,调用getContainer()返回null,并非单纯的数据库配置问题。

1. 安装必要依赖

确保composer.json已引入以下开发依赖:

  • symfony/test-pack:Symfony测试基础组件
  • pimcore/core:自带测试用的基础内核类

2. 创建测试专用最小内核

在tests目录下新建TestKernel.php,无需完整项目结构,仅需最小配置:

<?php

use Pimcore\HttpKernel\Kernel\PimcoreKernel;
use Symfony\Component\Config\Loader\LoaderInterface;
use Your\Bundle\Namespace\YourPimcoreBundle; // 替换为你自己的Bundle类

class TestKernel extends PimcoreKernel
{
    public function registerBundles(): array
    {
        $bundles = parent::registerBundles();
        $bundles[] = new YourPimcoreBundle(); // 注册你开发的Bundle
        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        // 直接在内核中配置数据库连接,无需单独config目录
        $loader->load(function (\Symfony\Component\DependencyInjection\ContainerBuilder $container) {
            $container->loadFromExtension('doctrine', [
                'dbal' => [
                    'connections' => [
                        'default' => [
                            'url' => 'mysql://db_user:db_pass@127.0.0.1:3306/pimcore_test?serverVersion=8.0', // 替换为你的测试库连接信息
                        ],
                    ],
                ],
            ]);
            // 其他必要的Pimcore基础配置
            $container->setParameter('pimcore.flags.in_test', true);
            $container->setParameter('kernel.secret', 'test-secret-123');
        });
    }

    public function getProjectDir(): string
    {
        return dirname(__DIR__); // 指向Bundle根目录
    }
}

3. 配置PHPUnit启动引导

在tests目录下新建bootstrap.php,测试运行前初始化内核并赋值Pimcore静态容器:

<?php

require dirname(__DIR__) . '/vendor/autoload.php';

$kernel = new TestKernel('test', true);
$kernel->boot();

// 核心:将容器实例赋值给Pimcore静态类,解决getContainer()返回null的问题
\Pimcore::setContainer($kernel->getContainer());

修改phpunit.xml.dist,指定启动引导文件:

<phpunit bootstrap="tests/bootstrap.php">
    <!-- 其他PHPUnit配置保持不变 -->
    <testsuites>
        <testsuite name="Your Bundle Test Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

4. 初始化测试数据库

首次运行测试前,执行以下命令初始化Pimcore系统表:

php bin/console pimcore:install:database --env=test

如果需要自定义测试数据,可以在测试类的setUpBeforeClass方法中导入SQL文件或加载数据fixtures。

5. 编写测试用例

测试类继承Symfony的KernelTestCase即可正常调用Pimcore的数据库相关逻辑:

<?php

namespace Your\Bundle\Tests;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Pimcore\Model\DataObject\Concrete;

class DataObjectTest extends KernelTestCase
{
    public function testDataObjectSave()
    {
        // 此处可正常调用Pimcore数据对象逻辑,不会再报容器null错误
        $object = new Concrete();
        $object->setKey('test-object');
        $object->setParentId(1);
        $object->save();

        $this->assertNotNull($object->getId());
    }
}

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:06:00