我的phpunit中的实体管理器存在问题。
这是我的测试:
public function testValidChangeEmail()
{
$client = self::createAuthClient('user','password');
$crawler = $client->request('GET', '/user/edit/30');
$crawler = $client->submit($crawler->selectButton('submit')->form(array(
'form[email]' => 'new@email.com',
)));
/*
* With this em, this work perfectly
* $em = $client->getContainer()->get('doctrine.orm.entity_manager');
*/
$user = self::$em->getRepository('MyBundle:User')->findUser('new@email.com');
die(var_dump($user->getEmail()));
}
这是我的WebTestCase,它扩展了原始的WebTestCase:
class WebTestCase extends BaseWebTestCase
{
static protected $container;
static protected $em;
static protected function createClient(array $options = array(), array $server = array())
{
$client = parent::createClient($options, $server);
self::$em = $client->getContainer()->get('doctrine.orm.entity_manager');
self::$container = $client->getContainer();
return $client;
}
protected function createAuthClient($user, $pass)
{
return self::createClient(array(), array(
'PHP_AUTH_USER' => $user,
'PHP_AUTH_PW' => $pass,
));
}
如您所见,我在创建客户端时替换了self :: $ em。
我的问题:
在我的测试中,die()
向我提供旧电子邮件,而不是在测试中注册的新电子邮件(new@email.com
)。但是在我的数据库中,我已正确保存new@email.com
。
当我在数据库中检索我的用户时,我使用sefl::$em
。如果我在评论中使用$em
,我会检索到正确的新电子邮件。
我不明白为什么在我的WebTestCase中,我可以访问新的实体管理器......
答案 0 :(得分:4)
您无法访问新的实体管理器,因为Symfony的客户端类在每个请求之前关闭内核,这意味着它会擦除整个服务容器并从头开始重新构建它。
因此,在SECOND请求之后,您获得的实体管理器与您在自己的WebTestCase类中的实体管理器非常不同。 (我之后说过,因为只有在已经执行任何请求的情况下客户端关闭内核)
问题是 - 你真的需要在你的WebTestCase类中使用相同的实体manafer吗?实际上,您可能希望使用相同的实体管理器,因为您希望在请求之间对事务进行get controll。但在这种情况下,您应该创建自己的测试客户端类扩展symfony的一个,并定义静态连接或实体管理器,并在每个请求之前将其放入容器中。
看一下例子: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests