如何在 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 图像