如何与数据库交互的测试代码
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何与数据库交互的测试代码
如果您的代码与数据库交互,例如读取数据或存储数据,你需要调整你的测试要考虑到这一点。有很多方法来处理这个问题。在一个单元测试,您可以创建一个模拟的存储库
并用它来返回预期的对象。在功能测试中,您可能需要准备一个测试数据库预定义的值,以确保您的测试总是相同的数据。
请注意
如果你想测试你的直接查询,看看如何测试原则库吗。
嘲笑的存储库
在单元测试中
如果你想测试代码取决于一个教义存储库
孤立的,你需要模拟存储库
。通常你注入EntityManager
到您的类,并使用它来获取存储库。这使得事情更困难,因为您需要模拟的EntityManager
和你的库类。
提示
是可能的(和一个好主意)将直接通过注册您的存储库是一个存储库工厂服务这是一点工作要设置,但使测试更容易,你只需要模拟存储库。
假设您想要的类测试是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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
通过构造函数注入到类,很容易通过模拟对象在一个测试:
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
使用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 (1100年,美元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许可证。