有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据。但这需要太长时间,而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库。
如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?
答案 0 :(得分:3)
只要您将实体与数据库逻辑分离,就不应该对单元测试实体有任何问题。
这是关于测试存储库的非常好的文章: https://symfony2-document.readthedocs.org/en/latest/cookbook/testing/doctrine.html。
此外,您可能对此Q& A:Testing Controllers in Symfony2 with Doctrine
感兴趣答案 1 :(得分:1)
我们设置了一个名为TestManager的单例,它为所有测试设置一次空测试DB。然后我们在setUp()方法中截断对于测试很重要的表,并使用doctrine API在PHP中设置fixture。我们使用MySql。
这给了我们每次启动phpunit大约10秒的延迟,但这与测试次数无关。我认为通过使用内存版本的sqlite可以大大改善这一点。
Personaly通过查看Johann Schmitt functional test for the payment core bundle的代码,我学到了很多关于使用symfony2 / doctrine设置功能测试的知识。
只是为了清楚地表明:如果你想进行纯粹的单元测试,你必须一起模仿教义。其他一切都是功能/集成测试。但是,这种辩护往往是学术性的,而且只是为了模仿学说而付出很多努力。
答案 2 :(得分:0)
我发现一个对单元测试有用的技巧是使用sqlite的基于文件的数据库。您可以在名为' emptydatabase.dat'的文件中创建空数据库表。并使用sqlite加载它。现在,在测试结束时,您可以覆盖空数据库文件并从新数据库开始。
您可以使用以下代码创建空架构文件:
$classes = array(
$em->getClassMetadata('MyAPIBundle:Currency'),
$em->getClassMetadata('MyAPIBundle:Permission'),
$em->getClassMetadata('MyAPIBundle:Role'),
$em->getClassMetadata('MyAPIBundle:User'),
);
$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$tool->createSchema($classes);
rename($schemafile, dirname(__FILE__) . '/../Data/schema.dat');
print "Schema file was regenerated\n";
同时强>
我们还为每个需要操作的主要实体创建了一项服务,并轻松地自行测试了这项独立服务。起初我们在存储库中拥有所有内容,但这没有任何意义,但是通过将它们移动到服务并嘲笑所有依赖对象,事情变得非常好