如何测试与数据库交互的代码
编辑本页警告:您正在浏览的文档欧宝官网下载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
名称空间Acme\DemoBundle\工资;使用学说\常见的\持久性\ObjectManager;类SalaryCalculator{私人$entityManager;公共函数__construct(ObjectManager$entityManager){$这->entityManager =$entityManager;}公共函数calculateTotalSalary($id){$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
使用Acme\DemoBundle\工资\SalaryCalculator;类SalaryCalculatorTest扩展\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));$salaryCalculator=新SalaryCalculator ($entityManager);$这->assertequal (2100,$salaryCalculator->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许可证。