我问自己如何在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中定义的客户端。它完全符合我之前描述的内容。
你对如何做得更好或者 - 至少 - 有更好的表现有任何想法吗?
谢谢!
答案 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)