如何测试一个理论库
编辑本页如何测试一个理论库
另请参阅
的主测试指南描述如何为自动化测试使用和设置数据库。本文的内容展示了测试Doctrine存储库的方法。
在单元测试中模拟理论存储库
不建议使用单元测试原则存储库.存储库是针对真实的数据库连接进行测试的。但是,如果您仍然需要这样做,请查看下面的示例。
假设你想要测试的类是这样的:
12 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
通过构造函数注入到类中,您可以在测试中传递一个模拟对象:
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 37 38 39
/ /测试/工资/ SalaryCalculatorTest.php名称空间应用程序\测试\工资;使用应用程序\实体\员工;使用应用程序\工资\SalaryCalculator;使用学说\持久性\ObjectManager;使用学说\持久性\ObjectRepository;使用PHPUnit)\框架\TestCase;类SalaryCalculatorTest扩展TestCase{公共函数testCalculateTotalSalary(){$员工=新员工();$员工->setSalary (1000);$员工->setBonus (1100);//现在,模拟存储库,使其返回员工的模拟$employeeRepository=$这->createMock (ObjectRepository::类);//在PHPUnit 5.3或以下使用getMock(// $employeeRepository = $this->getMock(ObjectRepository::class);$employeeRepository->预计($这->任何())->方法(“发现”)->willReturn ($员工);//最后,模拟EntityManager以返回存储库的模拟//(如果被测试的类注入//它使用的存储库而不是整个对象管理器)$objectManager=$这->createMock (ObjectManager::类);//在PHPUnit 5.3或以下使用getMock(// $this->getMock(objectManager::class);$objectManager->预计($这->任何())->方法(“getRepository”)->willReturn ($employeeRepository);$salaryCalculator=新SalaryCalculator ($objectManager);$这->assertequal (2100,$salaryCalculator->calculateTotalSalary (1));}}
在本例中,您将由内而外构建模拟,首先创建由对象返回的雇员存储库
函数返回EntityManager
.这样,测试中就不涉及真正的类。
理论存储库的功能测试
在功能测试您将使用实际的Doctrine存储库对数据库进行查询,而不是模仿它们。为此,通过服务容器获取实体管理器,如下所示:
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 37 38 39 40 41
/ /测试/仓库/ ProductRepositoryTest.php名称空间应用程序\测试\存储库;使用应用程序\实体\产品;使用ob娱乐下载\包\FrameworkBundle\测试\KernelTestCase;类ProductRepositoryTest扩展KernelTestCase{/ * * *@var\学说\ ORM \ EntityManager * /私人$entityManager;受保护的函数设置():无效{$内核=自我::bootKernel ();$这->entityManager =$内核->getContainer ()->get (“原则”)->getManager ();}公共函数testSearchByName(){$产品=$这->entityManager->getRepository(产品::类)->findOneBy ([“名字”= >“无价的小部件”]);$这->assertSame (14.50,$产品->getPrice ());}受保护的函数拆卸():无效{父::tearDown ();//建议这样做以避免内存泄漏$这->entityManager->close ();$这->entityManager =零;}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。