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

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

【问题讨论】:

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

标签: symfony doctrine functional-testing fixture


【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2013-11-12
      • 2010-11-02
      • 2012-08-11
      相关资源
      最近更新 更多