关键要点
app/config/config_test.php
。使用 SQLite3 对内存数据库的支持可以通过向功能数据库发送 SQL 查询来促进测试,从而无需模拟存储库类。测试与数据库交互的代码可能非常痛苦。一些开发人员模拟数据库抽象,因此没有测试实际的查询。其他开发人员为开发环境创建测试数据库,但在持续集成和维护此数据库的状态方面,这也可能很痛苦。内存数据库是这些选项的替代方案。由于它们仅存在于应用程序的内存中,因此它们是真正的一次性且非常适合测试的。值得庆幸的是,这些非常易于与使用 Doctrine 的 Symfony 应用程序一起设置。尝试阅读我们关于使用 Symfony 进行功能测试的指南,以了解测试应用程序的端到端行为。
Symfony 环境配置
Symfony 框架最强大的功能之一是能够创建具有自己独特配置的不同环境。Symfony 开发人员可能会忽略此功能,尤其是在此处研究的鲜为人知的测试环境方面。Symfony 关于掌握和创建新环境的指南解释了框架如何处理不同环境的配置,并展示了一些有用的示例。需要编辑以设置可丢弃测试数据库的配置文件是 app/config/config_test.php
。当在测试套件中访问应用程序时,内核将使用测试环境加载,并且将处理此配置文件。
使用 Doctrine 的内存数据库
SQLite3 支持内存数据库,非常适合测试。使用这些数据库,可以通过实际向功能数据库发送 SQL 查询来测试应用程序,从而无需费力地模拟具有预定义行为的存储库类。数据库将在测试开始时是新的,并在结束时干净地销毁。要覆盖默认的 Doctrine 连接配置,需要将以下行添加到测试环境配置文件中。如果应用程序中配置了多个 Doctrine 连接,则可能需要稍微调整一下以进行匹配。
<code class="language-yaml"># app/config/config_test.yml doctrine: dbal: driver: pdo_sqlite memory: true charset: UTF8</code>
在测试类中使用数据库
在测试类中使用这个闪亮的新内存数据库时,必须首先构建模式。这意味着创建实体的表并加载测试套件所需的任何固定装置。下面的类可以用作数据库引导程序,它可以完成大部分工作。它具有与强制运行 Doctrine 模式更新控制台命令相同的效果。
<code class="language-php"><?php namespace Tests\AppBundle; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Tools\SchemaTool; use Symfony\Component\HttpKernel\KernelInterface; class DatabasePrimer { public static function prime(KernelInterface $kernel) { // 确保我们处于测试环境中 if ('test' !== $kernel->getEnvironment()) { throw new \LogicException('Primer must be executed in the test environment'); } // 从服务容器获取实体管理器 $entityManager = $kernel->getContainer()->get('doctrine.orm.entity_manager'); // 使用我们的实体元数据运行模式更新工具 $metadatas = $entityManager->getMetadataFactory()->getAllMetadata(); $schemaTool = new SchemaTool($entityManager); $schemaTool->updateSchema($metadatas); // 如果您使用的是 Doctrine Fixtures Bundle,您可以在此处加载它们 } }</code>
如果需要实体管理器来测试类,则必须应用引导程序:
<code class="language-php"><?php namespace Tests\AppBundle; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Tests\AppBundle\DatabasePrimer; class FooTest extends KernelTestCase { public function setUp() { self::bootKernel(); DatabasePrimer::prime(self::$kernel); } public function testFoo() { $fooService = self::$kernel->getContainer()->get('app.foo_service'); // ... } }</code>
在上面的示例中,容器用于获取正在测试的服务。如果此服务依赖于实体管理器,它将使用在 setUp
方法中引导的相同实体管理器进行构建。如果需要更多控制,例如模拟另一个依赖项,则始终可以从容器中检索实体管理器并将其用于手动实例化需要测试的类。使用 Doctrine Fixtures Bundle 使用测试数据填充数据库也可能是一个好主意,但这取决于您的用例。
(此处应继续翻译剩余的FAQ部分,保持与原文结构一致)
以上是快速提示:使用一次性数据库测试Symfony应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!