2017-06-23 15 views
1

私はこのように私のコントローラのコードを持っている:レスポンスコードは403あるのでsymfonyのセッションとPHPUnitのトラブル

public function testSomeActionFirst() 
{ 
    $client = static::createClient(); 
    $client->request('POST', $this->generateRoute('my_route')); 
    return $client->getResponse()->getContent(); 
} 

public function testSomeActionSecond($key) 
{ 
    $client = static::createClient(); 
    $client->request('POST', $this->generateRoute('my_route'), [], [ 
     'key' => $key 
    ]); 
    $this->assertTrue($client->getResponse()->isOk() 
} 

そして、第二のテストは常に失敗し、:

/** 
* @param Request $request 
* @param $verifiedResponse 

* @Route(...) 

* @return mixed 
*/ 
public function someAction(Request $request) 
{ 
    $session = $request->getSession(); 
    $session->set('key', mt_rand(0, 999)); 

    if ($request->get('key') === $session->get('key')) { 
     return true; 
    } else { 
     return $session->get('key'); 
    } 
    throw $this->createAccessDeniedException(); 
} 

そして、ここでは私の2つのユニットテストですセッションは要求間で保存されないためです。どのように私はそれを修正することができます?

+0

同じテスト方法で2回連続してコールする必要があります – jack

答えて

0

それぞれの試験方法は、アイソレーションで実行されると仮定します。それ以外の場合は、のデバッグの問題に遭遇し、1つのテストが他のテストに影響を与えることになります。単一のテストの失敗は、他のテストの失敗につながります。そのようなテストスイートは、失敗したテストで何がうまくいかなかったかを教えてくれないため、ほとんど価値がありません。 これは最初に問題があるとは思わないかもしれませんが、を維持するとというテストスイートはすぐに非常に難しくなります。

したがって、を別々に実行することが可能です。

でもテストを実行する必要があります。

テストで使用しているWebクライアントは、すでにこのルールに従っており、各テストメソッドを実行する前にリセットされています。技術的にはintroduce test dependenciesが可能ですが、そのような方法でもクライアントはリセットされます。それはいいことです!

各テストケースで共通のアクションを実行する必要がある場合は、その動作をカプセル化(および名前付け)するヘルパーメソッドを作成します。たとえば、

class MyTest extends WebTestCase 
{ 
    private $client; 

    protected function setUp() 
    { 
     parent::setUp(); 
     $this->client = static::createClient(); 
    } 

    public function testSomeActionSecond() 
    { 
     $key = $this->requestKey(); 

     $this->client->request(
      'POST', 
      $this->generateRoute('my_route'), 
      [], 
      ['key' => $key] 
     ); 

     $this->assertTrue($this->client->getResponse()->isOk() 
    } 

    private function requestKey() 
    { 
     $this->client->request('POST', $this->generateRoute('my_route')); 

     return $this->client->getResponse()->getContent(); 
    } 
} 
関連する問題