2017-08-28 9 views
0

symfonyのロールアクセスでphpunitを使ってどのようにテストするか自分に尋ねています。 たとえば、セキュリティ設定でindexActionと5つの異なる役割がある場合、ユーザーAが401、ユーザーBが403、ユーザーCが500となることを確認したい場合...symfonyのコントローラへのアクセスをテストする

問題:実際にテストを実行するには時間がかかります。これは、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

可能性がありますが、非同期テストを実行することができる/並行して、全体の実行時間をスピードアップします。 – nifr

答えて

0

thisを使用して、$ this-> createClientWithを1回呼び出します。私はもっ​​と勧めるためにhereを見ることを提案する。

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()); 
} 
関連する問題