Symfony 4.1测试环境服务容器加载报错及配置问题排查
快速解决Symfony 4.1测试中的ServiceNotFoundException与DBALException
解决test.service_container不存在的问题
Symfony 4.x中测试环境并没有独立的test.service_container服务,直接使用service_container即可,但核心是要确保加载的是测试环境的容器,而非默认环境。
如果你的测试类基于自定义的KernelAwareTest,请修改setUp方法,显式启动测试环境的Kernel:
protected function setUp(): void { // 初始化test环境的Kernel,第二个参数为true表示开启调试模式 $this->kernel = new \AppKernel('test', true); $this->kernel->boot(); // 直接从Kernel获取容器,无需通过服务名查找 $this->container = $this->kernel->getContainer(); }
解决Doctrine DBAL的server_version未加载问题
出现这个错误的核心原因是容器加载的不是测试环境的配置(config_test.yml),而是默认环境的配置。按以下步骤排查:
- 确认AppKernel加载对应环境的配置
检查src/Kernel.php中的registerContainerConfiguration方法,确保它会根据环境加载对应目录或文件的配置:
public function registerContainerConfiguration(LoaderInterface $loader) { // 加载对应环境的packages配置 $loader->load($this->getProjectDir().'/config/packages/'.$this->environment.'/*.yaml'); $loader->load($this->getProjectDir().'/config/packages/'.$this->environment.'/*.yml'); // 加载对应环境的服务配置 $loader->load($this->getProjectDir().'/config/services_'.$this->environment.'.yaml'); $loader->load($this->getProjectDir().'/config/services_'.$this->environment.'.yml'); }
- 验证config_test.yml的Doctrine配置
确保config_test.yml中的DBAL配置正确且未被覆盖:
doctrine: dbal: server_version: '5.7' # 其他数据库连接配置(如url、driver等)
- 推荐使用官方测试基类
直接继承Symfony\Bundle\FrameworkBundle\Test\KernelTestCase,它会自动处理测试环境的容器初始化,避免手动管理Kernel的问题:
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; class YourTestClass extends KernelTestCase { protected function setUp(): void { // 显式指定启动test环境的Kernel self::bootKernel(['environment' => 'test']); // 直接获取测试环境容器 $this->container = self::$container; } }
内容的提问来源于stack exchange,提问作者Darius.V
相关产品推荐
相关产品推荐

