![](/img/trans.png)
[英]Symfony 4: how to load DataFixtures in a KernelTestCase
[英]Symfony2 + Functional Testing “DataFixtures load how set the proper order”
我正在学习测试我的Symfony2代码,并且尝试按原样构建测试,因此我正在使用DataFixtures加载数据,并且我认为这也可以测试我的实体。 我将使用一个测试作为示例: CreateCompanyControllerTest.php
,这是我在每个测试中运行的基本代码:
private $em;
protected static $application;
public function setUp() {
static::$kernel = static::createKernel();
static::$kernel->boot();
$this->em = static::$kernel->getContainer()->get('doctrine')->getManager();
self::runCommand('doctrine:schema:update --force');
$loader = new Loader();
$loader->addFixture(new LoadCompanyData());
$purger = new ORMPurger();
$executor = new ORMExecutor($this->em, $purger);
$executor->execute($loader->getFixtures());
}
protected static function runCommand($command) {
$command = sprintf('%s --quiet', $command);
return self::getApplication()->run(new StringInput($command));
}
protected static function getApplication() {
if (null === self::$application) {
$client = static::createClient();
self::$application = new Application($client->getKernel());
self::$application->setAutoExit(false);
}
return self::$application;
}
我不知道是否一直在运行命令doctrine:schema:update --force
因为它可以清理数据库,这是我的第一个疑问。 现在关于LoadCompanyData.php
同一问题,我有一些实体依赖项(请参见下面的代码:
$mediaType = $manager->getRepository('MediaBundle:NMediaType')->find(1);
$mediaStatus = $manager->getRepository('MediaBundle:NMediaStatus')->find(1);
但是由于我运行命令doctrine:schema:update --force
清理了我的数据库,然后测试失败并显示以下消息:
1)传递给Wuelto \\ Common \\ MediaBundle \\ Entity \\ Media :: setType()的Company \\ RegisterCompanyBundle \\ Tests \\ Controller \\ CreateCompanyControllerTest :: testcreateCompanyAction参数1必须是Common \\ MediaBundle \\ Entity \\ NMediaType的实例,给定null,在/var/www/html/kraken/src/Company/RegisterCompanyBundle/DataFixtures/ORM/LoadCompanyData.php在第46行并已定义
没错,因为该表为空。 然后知道这一点:
getOrder()
设置了夹具的加载顺序,但是,我如何使用它呢? 我的意思是,例如,在为公司加载数据之前,我应该首先添加从属实体的数据,对此有何建议? 始终清理测试数据库是一个好习惯,您的测试应该是自包含的,并且不要依赖以前测试中数据库中剩余的任何内容。
就是说,是的,您还应该设置固定装置或辅助函数,以在测试数据库中插入所需的任何必要数据。
您可以为每个测试文件执行一次此设置。 在时间上,数据库测试是昂贵的,因此,如果您可以摆脱对db的模拟调用,则应该这样做,但这完全取决于您要测试的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.