如何测试与数据库交互的代码

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何测试与数据库交互的代码

如果你的代码与数据库交互,例如从数据库中读取数据或将数据存储到数据库中,你需要调整你的测试来考虑这一点。有很多方法可以解决这个问题。在单元测试中,可以为类创建模拟存储库并使用它返回期望的对象。在功能测试中,您可能需要准备一个带有预定义值的测试数据库,以确保您的测试总是使用相同的数据。

请注意

如果要直接测试查询,请参见如何测试理论存储库

嘲笑的存储库在单元测试中

如果你想测试依赖于某个原则的代码存储库在孤立的情况下,您需要模拟存储库.通常你注入EntityManager并使用它来获取存储库。这使得事情变得更加困难,因为您需要模拟两个EntityManager以及您的存储库类。

提示

可以(也是一个好主意)通过将存储库注册为工厂服务这需要做更多的设置工作,但是使测试更容易,因为您只需要模拟存储库。

假设你想要测试的类是这样的:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
名称空间AcmeDemoBundle工资使用学说常见的持久性ObjectManagerSalaryCalculator{私人entityManager公共函数__construct(ObjectManagerentityManager{->entityManager =entityManager;}公共函数calculateTotalSalaryid{employeeRepository->entityManager->getRepository (“AcmeDemoBundle:员工”);员工userRepository->找到(id);返回员工->getSalary () +员工->getBonus ();}}

ObjectManager通过构造函数注入到类中,在测试中传递模拟对象很容易:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
使用AcmeDemoBundle工资SalaryCalculatorSalaryCalculatorTest扩展PHPUnit_Framework_TestCase{公共函数testCalculateTotalSalary(){//首先,模拟要在测试中使用的对象员工->getMock (“\ \ Acme \ DemoBundle \实体员工”);员工->预计(->一旦())->方法(“getSalary”->将(->returnValue (1000));员工->预计(->一旦())->方法(“getBonus”->将(->returnValue (1100));//现在,模拟存储库,使其返回员工的模拟employeeRepository->getMockBuilder (“\ \ ORM \ EntityRepository学说”->disableOriginalConstructor ()->getMock ();employeeRepository->预计(->一旦())->方法(“发现”->将(->returnValue (员工));//最后,模拟EntityManager以返回存储库的模拟entityManager->getMockBuilder (“\学说\常见\持久性\ ObjectManager”->disableOriginalConstructor ()->getMock ();entityManager->预计(->一旦())->方法(“getRepository”->将(->returnValue (employeeRepository));salaryCalculatorSalaryCalculator (entityManager);->assertequal (2100salaryCalculator->calculateTotalSalary (1));}}

在本例中,您将由内而外构建模拟,首先创建由对象返回的雇员存储库函数返回EntityManager.这样,测试中就不涉及真正的类。

更改功能测试的数据库设置

如果您有功能测试,您希望它们与真实的数据库交互。大多数情况下,您希望使用专用的数据库连接,以确保不会覆盖开发应用程序时输入的数据,并且能够在每次测试之前清除数据库。

要做到这一点,你可以指定一个覆盖默认配置的数据库配置:

1 2 3 4 5 6 7 8
# app / config / config_test.yml原则:#……dbal:主持人:本地主机dbname:testdb用户:testdb密码:testdb
1 2 3 4 5 6 7 8 9
<!——app/config/config_test.xml——> . txt<原则:配置><原则:dbal宿主“localhost”dbname“testdb”用户“testdb”密码“testdb”>原则:配置>
1 2 3 4 5 6 7 8 9
/ / app / config / config_test.php配置->loadFromExtension (“原则”数组“dbal”= >数组“主机”= >“localhost”“dbname”= >“testdb”“用户”= >“testdb”“密码”= >“testdb”,),));

确保您的数据库运行在本地主机上,并设置了定义的数据库和用户凭据。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。