Symfony 2:如何正确测试Doctrine模型?

时间:2013-01-22 00:06:01

标签: symfony doctrine-orm phpunit

有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据。但这需要太长时间,而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库。

如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?

3 个答案:

答案 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";

同时

我们还为每个需要操作的主要实体创建了一项服务,并轻松地自行测试了这项独立服务。起初我们在存储库中拥有所有内容,但这没有任何意义,但是通过将它们移动到服务并嘲笑所有依赖对象,事情变得非常好