7

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

如何隔离 Entity 和 EntityRepository 单元测试?有这方面的教程吗?

4

3 回答 3

3

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

这是关于测试存储库的非常好的文章: https ://symfony2-document.readthedocs.org/en/latest/cookbook/testing/doctrine.html 。

此外,您可能对此问答感兴趣:Testing Controllers in Symfony2 with Doctrine

于 2013-01-22T09:19:16.347 回答
1

我们设置了一个名为 TestManager 的单例,它为所有测试设置了一个空的测试数据库。然后我们在 setUp() 方法中只截断对测试很重要的表,并使用教义 API 在 PHP 中设置固定装置。我们为此使用 MySql。

这给了我们每次启动 phpunit 大约 10 秒的延迟,但这与测试的数量无关。我认为这可以通过使用内存版本的 sqlite 来改善很多。

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

只是为了让事情更清楚:如果你想进行纯单元测试,你必须一起模拟学说。其他一切都是功能/集成测试。但是这种区分通常是相当学术的,而且它只是为了嘲笑教义而做的很多工作。

于 2013-01-22T08:54:07.527 回答
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";

我们还为每个需要运营的主要实体创建了一项服务,并轻松地单独测试了该独立服务。起初我们在存储库中拥有所有东西,但这没有意义,但是通过将它们移动到服务并模拟所有依赖对象,事情变得很好

于 2013-01-22T00:21:50.190 回答