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

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

我怎样才能隔离Entity和EntityRepository单元测试? 有没有可用的教程?


只要将它们与数据库逻辑分离,就不应该对单元测试实体有任何问题。

这里是关于测试版本库的不错文章:https://symfony2-document.readthedocs.org/en/latest/cookbook/testing/doctrine.html。

此外,您可能对此问题感兴趣:在Symfony2中使用Doctrine测试控制器


我们设置了一个名为TestManager的单例,它为所有测试设置一个空的测试数据库。 然后,我们只截取setUp()方法中对测试非常重要的表格,并通过使用doctrine API在PHP中设置fixtures。 我们为此使用MySql。

这使我们每次启动phpunit都会延迟〜10s,但这与测试次数无关。 我认为这可以通过使用内存版本的sqlite进行很多改进。

我个人认为,通过查看Johann Schmitt对支付核心捆绑的功能测试的代码,我学到了很多关于使用symfony2 / doctrine设置功能测试的知识。

只是要说清楚:如果你想要进行纯粹的单元测试,你必须一起嘲讽教条。 其他一切都是功能/集成测试。 但往往这种淡化是相当学术化的,只是为了嘲笑教义。


我发现这对于单元测试很有用的技巧是使用sqlite的基于文件的数据库。 您可以在名为'emptydatabase.dat'的文件中创建空的数据库表并使用sqlite加载它。 现在在测试结束时,您可以覆盖空的数据库文件并从新的数据库开始。

您可以使用此代码创建空的模式文件:

        $classes = array(
            $em->getClassMetadata('MyAPIBundle:Currency'),
            $em->getClassMetadata('MyAPIBundle:Permission'),
            $em->getClassMetadata('MyAPIBundle:Role'),
            $em->getClassMetadata('MyAPIBundle:User'),
        );

        $tool = new DoctrineORMToolsSchemaTool($em);
        $tool->createSchema($classes);
        rename($schemafile, dirname(__FILE__) . '/../Data/schema.dat');

        print "Schema file was regeneratedn";

我们还为每个需要操作的主要实体创建了一项服务,并轻松地对独立服务进行了自行测试。 起初,我们拥有了Repository中的所有内容,但没有任何意义,但通过将它们移动到Service并嘲笑所有依赖对象,

链接地址: http://www.djcxy.com/p/68653.html

上一篇: Symfony 2: how to properly test Doctrine models?

下一篇: Is it possible to access GAE datastore without an http request?