gpt4 book ai didi

php - Symfony 2 中实体管理器和 phpunit 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:14 25 4
gpt4 key购买 nike

我的 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 中,我可以访问新的实体管理器...

最佳答案

您无法访问新的实体管理器,因为 Symfony 的客户端类会在每次请求之前关闭内核,这意味着它会删除整个服务容器并从头开始重新构建它。

因此,在第二个请求之后,您获得的实体管理器与您自己的 WebTestCase 类中的实体管理器截然不同。 (我是在第二个之后说的,因为只有在已经执行了任何请求时,客户端才会关闭内核)

问题是——您真的需要在您的 WebTestCase 类中使用相同的实体管理器吗?实际上,您可能想要使用相同的实体管理器,因为您想要控制请求之间的事务。但是在这种情况下,您应该创建自己的测试客户端类扩展 symfony 的类,并在那里定义静态连接或实体管理器,并在每次请求之前将其放入容器中。

看例子: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

关于php - Symfony 2 中实体管理器和 phpunit 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823021/

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