Symfony 5 Api测试createClient()LogicalException

问题描述 投票:1回答:1

正如标题所述,我正在使用Symfony 5构建API。我有一些控制器需要测试的用户权限不同,因此我决定创建两个具有不同角色的用户来进行测试-[C0 ]和ROLE_USER。当前代码是这样的(请注意,它不是完整的代码,只是一个虚拟的示例/起点)

ApiTestCase.php

ROLE_ADMIN

LocationControllerTest.php

<?php

namespace App\Tests;

use App\Entity\User;
use App\Tests\Http\RequestBuilder;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApiTestCase extends WebTestCase
{

    private static $userData = [
        'firstName' => 'Pera',
        'lastName'  => 'Peric',
        'email'     => '[email protected]',
        'password'  => 'test123',
        'roles'     => [
            'ROLE_USER'
        ]
    ];

    private static $adminUserData = [
        'firstName' => 'Admin',
        'lastName'  => 'Adminovic',
        'email'     => '[email protected]',
        'password'  => 'admin123',
        'roles'     => [
            'ROLE_ADMIN'
        ]
    ];

    public static function createTestUser()
    {
        $res = RequestBuilder::create(self::createClient())
            ->setMethod('POST')
            ->setUri('/api/v1/security/register')
            ->setJsonContent(self::$userData)
            ->getResponse();

        $data = $res->getJsonContent();
        return $data['data'];
    }

    public static function createTestAdminUser()
    {
        $res = RequestBuilder::create(self::createClient())
            ->setMethod('POST')
            ->setUri('/api/v1/security/register')
            ->setJsonContent(self::$adminUserData)
            ->getResponse();

        $data = $res->getJsonContent();
        var_dump($data);
        return $data['data'];
    }

    public static function deleteTestUser()
    {
        self::createClient()->getContainer()
            ->get('doctrine.orm.entity_manager')
            ->getRepository(User::class)
            ->deleteUserByEmail(self::$userData['email']);
    }

    public static function deleteTestAdminUser()
    {
        self::createClient()->getContainer()
            ->get('doctrine.orm.entity_manager')
            ->getRepository(User::class)
            ->deleteUserByEmail(self::$adminUserData['email']);
    }

}

[当我运行测试时( namespace App\Tests; use PHPUnit\Framework\TestCase; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class LocationControllerTest extends ApiTestCase { public static $user; public static $adminUser; public static function setUpBeforeClass() { self::$user = self::createTestUser(); self::$adminUser = self::createTestAdminUser(); } public function testUsersExist() { // this is jut to test out an idea $this->assertContains('ROLE_USER', self::$user['roles']); $this->assertContains('ROLE_ADMIN', self::$adminUser['roles']); } public static function tearDownAfterClass() { self::deleteTestUser(); self::deleteTestAdminUser(); } } 是别名sunit):

php bin/phpunit

我了解该错误,但似乎无法找到解决方案/此方法。同样,我很有可能以错误的方式进行了操作。

在数据库中,第一个用户被创建,而第二个用户在尝试创建它时抛出此错误。

我想实现的是,我有可以调用并创建虚拟用户/位置/等的(静态)方法。并将其用于测试该特定控制器,并在完成对该特定控制器的测试后销毁它/从数据库中删除它。

➜ skeleton master ✗ (*?) sunit --filter LocationController [10:12AM] PHPUnit 7.5.17 by Sebastian Bergmann and contributors. Testing Project Test Suite E 1 / 1 (100%) Time: 742 ms, Memory: 24.00 MB There was 1 error: 1) App\Tests\LocationControllerTest::testUsersExist LogicException: Booting the kernel before calling Symfony\Bundle\FrameworkBundle\Test\WebTestCase::createClient() is not supported, the kernel should only be booted once. in /Users/shkabo/code/skeleton/vendor/symfony/framework-bundle/Test/WebTestCase.php:44 Stack trace: #0 /Users/shkabo/code/skeleton/tests/ApiTestCase.php(45): Symfony\Bundle\FrameworkBundle\Test\WebTestCase::createClient() #1 /Users/shkabo/code/skeleton/tests/LocationControllerTest.php(16): App\Tests\ApiTestCase::createTestAdminUser() #2 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/src/Framework/TestSuite.php(703): App\Tests\LocationControllerTest::setUpBeforeClass() #3 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/src/Framework/TestSuite.php(746): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult)) #4 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/src/TextUI/TestRunner.php(652): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult)) #5 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/src/TextUI/Command.php(206): PHPUnit\TextUI\TestRunner->doRun(Object(PHPUnit\Framework\TestSuite), Array, true) #6 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/src/TextUI/Command.php(162): PHPUnit\TextUI\Command->run(Array, true) #7 /Users/shkabo/code/skeleton/bin/.phpunit/phpunit-7.5-0/phpunit(17): PHPUnit\TextUI\Command::main() #8 /Users/shkabo/code/skeleton/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php(291): include('/Users/shkabo/c...') #9 /Users/shkabo/code/skeleton/bin/phpunit(13): require('/Users/shkabo/c...') #10 {main} ERRORS! Tests: 1, Assertions: 0, Errors: 1. RequestBuilder

php symfony testing phpunit symfony5
1个回答
0
投票

问题是因为您使用了2次https://github.com/nebkam/fluent-test/blob/master/src/RequestBuilder.php,这将再次引导内核。为避免这种情况,您可以创建一个客户端,然后克隆该客户端,并使用一种方法修改某些参数,并将客户端作为参考。

© www.soinside.com 2019 - 2024. All rights reserved.