在Symfony 2.6上对许多请求进行测试隔离

时间:2015-01-31 08:51:56

标签: database symfony testing rollback isolation

我的项目使用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);
    }

}

2 个答案:

答案 0 :(得分:1)

说实话,进行此类测试的最简单,最安全的方法是创建一个用于测试目的的新数据库,并在config_test.yml中指定其配置。

使用这种方法,您将确保您的真实数据库不会被测试修改,并且在测试时也会使您的生活更轻松。

我通常会使用这种方法,但我不知道这是不是你想要的。

Documentation

希望它有所帮助。

答案 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();
}