gpt4 book ai didi

symfony - 如何在 liip 功能测试(symfony 2.8)中附加固定装置?

转载 作者:行者123 更新时间:2023-12-02 14:27:38 24 4
gpt4 key购买 nike

我想在我的功能测试中附加固定装置(基于 symfony 2.8 中的 LiipFunctionalTestBundle。即使它是我正在处理的开发数据库,​​我仍然需要附加固定装置,因为我将拥有:

  • 区域数据(国家、地区、县)
  • 车辆品牌和型号
  • ...

因此,在每次功能测试后清除数据库对我来说并不好。

注意:通过命令行附加固定装置(无需清除)可以成功:php app/consoledoctrine:fixtures:load --append

所以,下面是我的功能测试:

<?php

namespace Minn\APIBundle\Tests\Controller;

use Liip\FunctionalTestBundle\Test\WebTestCase as WebTestCase;
//use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as WebTestCase;
use Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;

class BrandControllerTest extends WebTestCase {

public function setUp() {
$this->auth = array(
'PHP_AUTH_USER' => 'restapi',
'PHP_AUTH_PW' => 'secretpw',
);

$this->client = static::createClient(array(), $this->auth);
}

public function testJsonGetPageAction() {
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData');
$this->loadFixtures($fixtures);
$brands = LoadBrandData::$brands;
$brand = array_pop($brands);

$route = $this->getUrl('api_1_brand_get_brand', array('id' => $brand->getId(), '_format' => 'json'));

$this->client->request('GET', $route, array('ACCEPT' => 'application/json'));
$response = $this->client->getResponse();
$this->assertJsonResponse($response, 200);
$content = $response->getContent();

$decoded = json_decode($content, true);
$this->assertTrue(isset($decoded['id']));
}

// ..
}

此测试会清除数据库。所以,我尝试了 link 中提出的代码通过进行此更改:

// removed code
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData');
$this->loadFixtures($fixtures);

// new code
$this->runCommand('doctrine:fixtures:load --append --no-interaction --fixtures=src/Minn/APIBundle/Tests/Fixtures/Entity/LoadBrandData.php');

但是,功能测试不起作用。

There was 1 error:

1) Minn\APIBundle\Tests\Controller\BrandControllerTest::testJsonGetPageAction
Error: Call to a member function getId() on null

/home/amine/NetBeansProjects/minnapi/src/Minn/APIBundle/Tests/Controller/BrandControllerTest.php:27

我尝试通过执行此更改来使用函数 loadFixtures() 中可用的选项:

// removed code:
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData');
$this->loadFixtures($fixtures);

// new code
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData');
$this->loadFixtures($fixtures, null,'doctrine', ORMPurger::PURGE_MODE_DELETE);

结论:每次运行功能测试后都会清除数据库。

那么,有什么建议吗?

谢谢

注意:composer.json 中描述的捆绑版本

    "doctrine/doctrine-fixtures-bundle": "dev-master",
"phpunit/phpunit": "5.4.*",
"liip/functional-test-bundle":"1.6.*",
"guzzle/guzzle": "v3.9.*"

最佳答案

避免数据库被清除的唯一解决方案是创建一个测试数据库。为此,请执行以下步骤:

测试数据库的配置

# the config has to be done in config_test.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: test
user: "%database_user%"
password: "%database_password%"
charset: UTF8

创建数据库和表

// this command is run only once (just for creating the testing db)
$ php app/console doctrine:database:create --env=test
// this command is needed when you have new entities
$ php app/console doctrine:schema:create --env=test

如何在测试中加载装置?

    $fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData');
$this->loadFixtures($fixtures);
$brands = LoadBrandData::$brands;

希望对其他人有帮助!

关于symfony - 如何在 liip 功能测试(symfony 2.8)中附加固定装置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com