如何与数据库交互的测试代码
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何与数据库交互的测试代码
如果您的代码与数据库交互,例如读取数据或存储数据,你需要调整你的测试要考虑到这一点。有很多方法来处理这个问题。在一个单元测试,您可以创建一个模拟的存储库
并用它来返回预期的对象。在功能测试中,您可能需要准备一个测试数据库预定义的值,以确保您的测试总是相同的数据。
请注意
如果你想测试你的直接查询,看看如何测试原则库吗。
嘲笑的存储库
在单元测试中
如果你想测试代码依赖于孤立主义库,您需要模拟存储库
。通常你注入EntityManager
到您的类,并使用它来获取存储库。这使得事情更困难,因为您需要模拟的EntityManager
和你的库类。
提示
是可能的(和一个好主意)将直接通过注册您的存储库是一个存储库工厂服务。这是一点工作要设置,但使测试更容易,你只需要模拟存储库。
假设您想要的类测试是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src / AppBundle /工资/ SalaryCalculator.php名称空间AppBundle\工资;使用学说\常见的\持久性\ObjectManager;类SalaryCalculator{私人美元entityManager;公共函数__construct(ObjectManager美元entityManager){美元这- >entityManager =美元entityManager;}公共函数calculateTotalSalary(美元id){美元employeeRepository=美元这- >entityManager- >getRepository (“AppBundle:员工”);美元员工=美元employeeRepository- >找到(美元id);返回美元员工- >getSalary () +美元员工- >getBonus ();}}
自ObjectManager
通过构造函数注入到类,很容易通过模拟对象在一个测试:
1 2 3 4 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 37 38 39 40 41 42 43
/ /测试/ AppBundle /工资/ SalaryCalculatorTest.php名称空间测试\AppBundle\工资;使用AppBundle\工资\SalaryCalculator;使用AppBundle\实体\员工;使用学说\ORM\EntityRepository;使用学说\常见的\持久性\ObjectManager;类SalaryCalculatorTest扩展\PHPUnit_Framework_TestCase{公共函数testCalculateTotalSalary(){/ /首先,模拟测试中使用的对象美元员工=美元这- >createMock(员工::类);美元员工- >预计(美元这- >一旦())- >方法(“getSalary”)- >将(美元这- >returnValue (1000年));美元员工- >预计(美元这- >一旦())- >方法(“getBonus”)- >将(美元这- >returnValue (1100年));/ /现在,模拟存储库返回员工的模拟美元employeeRepository=美元这- >getMockBuilder (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 - - ><原则:配置><原则: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”)));
确保你的数据库运行在本地主机和定义的数据库和用户凭证。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。