我的项目使用Symfony 2.6。我试图隔离我的测试,以便不对我的数据库进行任何更改。
我设法用一个请求隔离我的测试。但是当它们中有很多时,它不起作用,我无法找到原因。有什么想法吗?
这是我的testController代码:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class RequestControllerTest extends WebTestCase{
protected $client;
protected $entityManager;
protected function setUp(){
parent::setUp();
$this->client = static::createClient();
$this->entityManager = $this->client->getContainer()->get('doctrine')->getManager();
$this->entityManager->beginTransaction();
}
protected function tearDown(){
parent::tearDown();
$this->entityManager->rollback();
$this->entityManager->close();
}
// This test is working just fine : the request isn't deleted from database at the end
public function testIsolationOK(){
$this->client->request('DELETE', self::WEB_SERVICES_EXISTING_REQUEST_URL);
$this->client->request('GET', self::WEB_SERVICES_EXISTING_REQUEST_URL);
}
// But this one isn't working : the request is deleted from database at the end
public function testIsolationNOK(){
$this->client->request('GET', self::WEB_SERVICES_EXISTING_REQUEST_URL);
$this->client->request('DELETE', self::WEB_SERVICES_EXISTING_REQUEST_URL);
}
}
答案 0 :(得分:1)
说实话,进行此类测试的最简单,最安全的方法是创建一个用于测试目的的新数据库,并在config_test.yml
中指定其配置。
使用这种方法,您将确保您的真实数据库不会被测试修改,并且在测试时也会使您的生活更轻松。
我通常会使用这种方法,但我不知道这是不是你想要的。
希望它有所帮助。
答案 1 :(得分:0)
我终于设法让它以这种方式运作:
public function testIsolationOK(){
$this->client->request('GET', self::WEB_SERVICES_EXISTING_REQUEST_URL);
$this->setUp();
$this->client->request('DELETE', self::WEB_SERVICES_EXISTING_REQUEST_URL);
}
我不知道这是否是正确的方法,但它有效。
这里提醒一下setUp
方法:
protected function setUp(){
parent::setUp();
$this->client = static::createClient();
$this->entityManager = $this->client->getContainer()->get('doctrine')->getManager();
$this->entityManager->beginTransaction();
}