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

Symfony 2:如何正确测试条令模型?,symfony,doctrine-orm,phpunit,Symfony,Doctrine Orm,Phpunit,在Symfony 2应用程序中是否有适当的单元测试原则模型的方法?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确地存储(和处理)数据。但这需要太长时间,而且非常糟糕,因为我必须为每个套件设置装置,并在套件完成后清除数据库 如何隔离实体和实体存储单元测试?这方面有教程吗 我发现对单元测试有用的一个技巧是使用sqlite的基于文件的数据库。您可以在名为“emptydatabase.dat”的文件中创建空数据库表,并使用sqlite加载它。现在,在测试结束时,您可以覆盖空的数据库文件并从一

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


如何隔离实体和实体存储单元测试?这方面有教程吗

我发现对单元测试有用的一个技巧是使用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";
同时


我们还为每个需要操作的主要实体创建了一个服务,并且可以轻松地单独测试该独立服务。起初,我们在存储库中保存了所有内容,但这没有意义,但是通过将它们移动到服务中并模拟所有依赖对象,一切都很顺利

我们已经建立了一个名为TestManager的单例,它为所有测试设置了一次空的测试数据库。然后,我们在setUp()方法中只截断对测试非常重要的表,并使用doctrine API在PHP中设置fixture。我们使用MySql来实现这一点

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

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


为了让事情更清楚:如果你想进行纯粹的单元测试,你必须一起模拟原则。其他一切都是功能/集成测试。但这种区分通常是相当学术性的,模拟原则需要做很多工作。

只要保持实体与数据库逻辑的解耦,单元测试就不应该有任何问题

下面是一篇关于测试存储库的非常好的文章: .


此外,您可能会对这个问答感兴趣:

在doctrine orm文件夹中,有一个测试套件,其中包含。。。这些是面向条令的单元测试,带有条令的AbstractTestSuite,而不是我的应用程序。我正在寻找一种简单而正确的方法,在我的捆绑包中对我自己的模型进行单元测试。这并不是完全孤立的,因为你必须设置装置并清除步骤。你必须在每次运行测试时设置装置。您还可以使用sqlite的内存版本,这对您来说可能会更好。我必须使用基于文件的方法的原因是,我正在处理一个分片sql,每次切换到不同的数据库时,我都会丢失内存中的数据。