测试角色访问symfony中的控制器

时间:2017-08-28 16:07:44

标签: symfony unit-testing phpunit roles

我问自己如何在symfony角色访问中使用phpunit进行测试。 例如,如果我的安全配置中有一个indexAction和5个不同的角色,我想确保用户A将拥有401,用户B是403,用户C是500 ...

但它引起了一个问题:测试执行起来真的很长,因为我们通过行动进行了5次功能测试。

现在,我正在做那样的事情:

/**
 * @covers \App\Bundle\FrontBundle\Controller\DefaultController::indexAction()
 *
 * @dataProvider rolesAllAccess
 *
 * @param string  $user
 * @param integer $expectedCode
 *
 * @return void
 */
public function testRolesIndexAction($user, $expectedCode)
{
    $client = $this->createClientWith($user);
    $client->request('GET', '/');

    $this->assertEquals($expectedCode, $client->getResponse()->getStatusCode());
}

函数createClientWith验证我之前在dataProvider中定义的客户端。它完全符合我之前描述的内容。

你对如何做得更好或者 - 至少 - 有更好的表现有任何想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

取决于您的身份验证方法。我用JWT。此外,我的所有Web测试都扩展了扩展WebTestCase的ApiTestCase。在所有WebTestCases中,我使用了一个已登录的用户。记录使用登录设置方法。

abstract class ApiTestCase extends WebTestCase
{
    protected function setUp()
    {
        $client = static::makeClient();

        $client->request(
            'POST',
            '/tokens', [
                'username' => 'username',
                'password' => 'password'
            ], [
                // no files here
            ],
            $headers = [
                'HTTP_CONTENT_TYPE' => 'application/x-www-form-urlencoded',
                'HTTP_ACCEPT' => 'application/json',
            ]
        );

        $response = $client->getResponse();

        $data = json_decode($response->getContent(), true);

        $this->client = static::createClient(
            array(),
            array(
                'HTTP_Authorization' => sprintf('%s %s', 'Bearer', $data['token']),
                'HTTP_CONTENT_TYPE' => 'application/json',
                'HTTP_ACCEPT'       => 'application/json',
            )
        );
    }
}

这是一个测试的例子:

class DivisionControllerTest extends ApiTestCase
{
    public function testList()
    {
        $this->client->request('GET', '/resource');

        $response = $this->client->getResponse();
        $expectedContent = ' !!! put expected content here !!! ';

        $this->assertEquals(
            $expectedContent,
            $response->getContent()
        );
    }
}

您的测试可能

public function testRolesIndexAction($expectedCode)
{
    $this->client->request('GET', '/');

    $this->assertEquals($expectedCode, $this->client->getResponse()->getStatusCode());
}

答案 1 :(得分:0)

尝试使用this拨打一次$ this-> createClientWith。我建议您查看here以获得更多推荐。