Symfony2 +功能测试" DataFixtures加载如何设置正确的顺序"

时间:2014-03-23 17:51:31

标签: unit-testing symfony testing doctrine-orm functional-testing

我正在学习测试我的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)   公司\ RegisterCompanyBundle \测试\控制器\ CreateCompanyControllerTest :: testcreateCompanyAction   参数1传递给Wuelto \ Common \ MediaBundle \ Entity \ Media :: setType()   必须是Common \ MediaBundle \ Entity \ NMediaType的实例,为null   给予,召唤   /var/www/html/kraken/src/Company/RegisterCompanyBundle/DataFixtures/ORM/LoadCompanyData.php   在第46行并定义

它是正确的,因为该表是空的。然后知道这个:

  1. 有什么方法可以避免这种情况吗?
  2. 我应该为任何依赖实体创建一个夹具,然后在我需要的地方打电话吗?在这种情况下,任何一个例子都可以,因为我不知道如何。
  3. 我知道数据夹具中的getOrder()设置了加工灯具的顺序,但是我如何使用它?我的意思是例如在加载公司的数据之前我应该​​先为依赖实体添加数据,对此有何建议?

1 个答案:

答案 0 :(得分:1)

总是清理测试数据库是一种很好的做法,您的测试应该是自包含的,而不是依赖于之前测试中数据库中遗留的任何内容。

话虽如此,是的,你还应该设置fixtures或helper函数,在你的测试数据库中插入你需要的任何必要数据。

您可以为每个测试文件执行一次此设置。数据库测试费用昂贵,时间紧迫,所以如果您可以通过模拟调用db来实现这一点,那么这一切都取决于您要测试的内容。