如何与数据库交互的测试代码
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何与数据库交互的测试代码
如果您的代码与数据库交互,例如读取数据或存储数据,你需要调整你的测试要考虑到这一点。有很多方法来处理这个问题。在一个单元测试,您可以创建一个模拟的存储库
并用它来返回预期的对象。在功能测试中,您可能需要准备一个测试数据库预定义的值,以确保您的测试总是相同的数据。
请注意
如果你想测试你的直接查询,看看如何测试原则库吗。
提示
一个受欢迎的技术来提高性能的测试与数据库交互是开始一个事务之前每个测试,测试完成后回滚该事务。这使它不必要的重新创建数据库每次测试前或重新加载装置。一个欧宝体育平台怎么样社区束称为DoctrineTestBundle提供了这个功能。
嘲笑的存储库
在单元测试中
如果你想测试代码依赖于孤立主义库,您需要模拟存储库
。通常你注入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日24
/ / src /工资/ SalaryCalculator.php名称空间应用程序\工资;使用应用程序\实体\员工;使用学说\常见的\持久性\ObjectManager;类SalaryCalculator{私人美元objectManager;公共函数__construct(ObjectManager美元objectManager){美元这- >objectManager =美元objectManager;}公共函数calculateTotalSalary(美元id){美元employeeRepository=美元这- >objectManager- >getRepository(员工::类);美元员工=美元employeeRepository- >找到(美元id);返回美元员工- >getSalary () +美元员工- >getBonus ();}}
自EntityManagerInterface
通过构造函数注入到类,很容易通过模拟对象在一个测试:
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
/ /测试/工资/ SalaryCalculatorTest.php名称空间应用程序\测试\工资;使用应用程序\实体\员工;使用应用程序\工资\SalaryCalculator;使用学说\常见的\持久性\ObjectManager;使用学说\常见的\持久性\ObjectRepository;使用PHPUnit)\框架\TestCase;类SalaryCalculatorTest扩展TestCase{公共函数testCalculateTotalSalary(){美元员工=新员工();美元员工- >setSalary (1000年);美元员工- >setBonus (1100年);/ /现在,模拟存储库返回员工的模拟美元employeeRepository=美元这- >createMock (ObjectRepository::类);/ /使用getMock PHPUnit) 5.3或以下()/ / $ employeeRepository = $ this - > getMock (ObjectRepository::类);美元employeeRepository- >预计(美元这- >任何())- >方法(“发现”)- >willReturn (美元员工);/ /最后,模拟EntityManager返回存储库的模拟美元objectManager=美元这- >createMock (ObjectManager::类);/ /使用getMock PHPUnit) 5.3或以下()/ / $ objectManager = $ this - > getMock (objectManager::类);美元objectManager- >预计(美元这- >任何())- >方法(“getRepository”)- >willReturn (美元employeeRepository);美元salaryCalculator=新SalaryCalculator (美元objectManager);美元这- >assertequal (2100年,美元salaryCalculator- >calculateTotalSalary (1));}}
在这个例子中,您正在构建模拟从内到外,第一个创建员工得到返回的存储库
,这本身得到返回的EntityManager
。这种方式,没有真正的类是参与测试。
更改数据库设置为功能测试
如果你有功能测试,你希望他们与一个真正的数据库进行交互。大部分时间你想使用一个专用的数据库连接,以确保不覆盖数据输入在开发应用程序时,也能够清晰的数据库在每次测试之前。
要做到这一点,您可以覆盖的值DATABASE_URL
env var的phpunit.xml.dist
使用不同的数据库进行测试:
1 2 3 4 5 6 7 8
< ?xml version = " 1.0 " charset =“utf - 8”? ><phpunit)><php>< !——价值学说在DSN连接字符串格式- - ><env的名字=“DATABASE_URL”价值=“mysql: / /用户名:PASSWORD@127.0.0.1 / DB_NAME”/ >< /php>< !——……- - >< /phpunit)>