Symfony 在功能测试中,在每次测试出现身份验证问题之前重置数据库

Symfony 在功能测试中,在每次测试出现身份验证问题之前重置数据库,symfony,phpunit,api-platform.com,Symfony,Phpunit,Api Platform.com,我正在为我的RESTAPI实现功能测试。Api受授权保护。为此,我选择了json_登录提供程序。到目前为止,一切顺利。身份验证在正常环境下通过网络进行访问时有效 现在我想要功能测试。为此,我通过配置的用户类创建一个用户,并将其保存在数据库中。一切正常。 当然,测试只工作一次,因为用户已经存在于以下测试中 因此,我尝试使用ResetDatabaseTrait或ReloadDatabaseTrait以及dmaicher/doctrine测试包hautelook/alice bundle。 两者都显示

我正在为我的RESTAPI实现功能测试。Api受授权保护。为此,我选择了json_登录提供程序。到目前为止,一切顺利。身份验证在正常环境下通过网络进行访问时有效

现在我想要功能测试。为此,我通过配置的用户类创建一个用户,并将其保存在数据库中。一切正常。 当然,测试只工作一次,因为用户已经存在于以下测试中

因此,我尝试使用ResetDatabaseTrait或ReloadDatabaseTrait以及
dmaicher/doctrine测试包
hautelook/alice bundle
。 两者都显示相同的行为:身份验证器无法找到新创建的用户。(
EntityUserProvider::loadUserByUsername
未找到任何用户)

显然,EntityUserProvider似乎在数据库中使用了不同的“连接”,无法查看这些库启动的事务

测试中负责持久化用户的实体管理器是使用

protected function setUp(): void {
    $kernel = self::bootKernel();
    $this->em = $kernel->getContainer()
        ->get('doctrine')
        ->getManager();
}
或者直接在使用创建用户之前

$em = self::$container->get('doctrine')->getManager();
这对我来说似乎是正确的。但在任何情况下,我都会得到相同的结果->“无效凭据”,因为找不到用户


也许有人能给我指出正确的方向?

经过一次令人耳目一新的休息后,我想起了创建测试时的一个细节。所有示例都不需要包含self:bootcenere()的安装方法。但是没有它,
self::$container
属性是空的,所以我将它添加到我的测试类中。也许有解决问题的办法

我是对的! 我正在使用
Api平台
包。因此,我的测试类基于
apipplatform\Core\Bridge\Symfony\Bundle\test\ApiTestCase
。该类没有setUp方法,但是检查
createClient()
时,我注意到内核是通过调用
bootKernel()
创建的,这也会停止任何正在运行的内核

因此,我的setUp()方法创建了一个内核。我用这个内核创建了我的用户。 然后我调用
createClient()
为请求创建测试客户端。这杀死了我最初的内核,并创建了一个新的内核,然后导致了问题


重新排列语句-首先创建客户端,然后从现在创建的容器中获取EntityManager,并在创建客户端后创建用户以解决问题。

在Api平台存储库中为此打开了一个问题: