如何在 Symfony 2 中从功能测试中加载固定装置

Posted

技术标签:

【中文标题】如何在 Symfony 2 中从功能测试中加载固定装置【英文标题】:How can I load fixtures from functional test in Symfony 2 【发布时间】:2013-06-10 02:47:25 【问题描述】:

我的 DoctrineFixturesBundle 已安装,我可以通过命令行加载夹具,但是,如何从我的功能测试中加载夹具?

【问题讨论】:

我的回答解决了您的问题吗?要么按照我暗示的问题在 setUp() 方法中加载固定装置,要么使用 LiipFunctionalTestBundle。 @nifr 谢谢它符合我的需要,我在你暗示的问题中使用了解决方案......我会考虑 LiipFunctionalTestBundle 的好处...... 【参考方案1】:

如果您使用 symfony 的 WebTestCase,实际上有一个非常简单的方法来加载您的固定装置。 你的夹具必须实现FixtureInterface;因此,您可以直接在测试的setUp() 方法中调用它的load() 方法。你只需要将EntityManager 传递给load() 方法,它可以从symfony 容器中获取:

public function setUp() 
    $client = static::createClient();
    $container = $client->getContainer();
    $doctrine = $container->get('doctrine');
    $entityManager = $doctrine->getManager();

    $fixture = new YourFixture();
    $fixture->load($entityManager);

【讨论】:

这错过了所有 ReferenceRepository 的东西 - addRef/getRef 不要忘记在加载调用之前添加参考存储库。 $fixture->setReferenceRepository(new ReferenceRepository($entityManager));【参考方案2】:

您可以在测试的setUp() 方法中加载固定装置,如this question 中所示。

您可以使用问题中的代码,但需要将 --append 附加到 doctrine:fixtures:load 命令中,以避免夹具包确认。

更好的解决方案是查看LiipFunctionalTestBundle,它可以更轻松地使用数据固定装置。

【讨论】:

【参考方案3】:

如果您想首先清除以前的测试数据表,我只是想提供一种稍微简洁的方法,例如如果您在 phpunit 中运行测试。

use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Loader;
use Namespace\FakeBundle\DataFixtures\ORM\YourFixtures;

public function setUp()

    static::$kernel = static::createKernel();
    static::$kernel->boot();
    $this->em = static::$kernel->getContainer()
        ->get('doctrine')
        ->getManager()
    ;

    $loader = new Loader();
    $loader->addFixture(new YourFixtures);

    $purger = new ORMPurger($this->em);
    $executor = new ORMExecutor($this->em, $purger);
    $executor->execute($loader->getFixtures());

    parent::setUp();

这允许加载固定装置,(您可以在添加固定装置方法中推送更多内容),并在加载表之前清除它们。 另请注意,MongoDB 使用 MongoDBPurger 和 MongoDBExecutor 具有相同的选项。 希望它可以帮助某人

【讨论】:

嗨,我正在尝试使用您的方法,但 $executor 意图删除整个数据库而不仅仅是相关表,为什么会这样?有关如何在夹具加载期间清除生成的数据的任何示例?【参考方案4】:

正如已经提到的,建议使用 LiipFunctionalTestBundle。 然后你想从Liip\FunctionalTestBundle\Test\WebTestCase 扩展你的WebTestCase。这将允许调用$this->loadFixtures(),它将一组固定装置作为参数。

$fixtures = array('Acme\MemeberBundle\DataFixtures\ORM\LoadMemberData');
$this->loadFixtures($fixtures);

更多细节我写了一个简短的blogpost。

【讨论】:

以上是关于如何在 Symfony 2 中从功能测试中加载固定装置的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中从文件中加载数据?

如何在 Pig 中从 json 中加载 json 和 value?

如何在 iOS 8 Objective c 中的 UIWebView 中从文档中加载 png 图像

如何在 Qt 中从 txt 文件中加载大数据

Symfony2 - Assetic - 在 CSS 中加载图像

在 Kivy 中从内存中加载图像