2012-10-10 62 views
5

我在phpunit中的實體管理器存在問題。Symfony 2中的實體管理器和phpunit問題

這是我的測試:

public function testValidChangeEmail() 
{ 
    $client = self::createAuthClient('user','password'); 

    $crawler = $client->request('GET', '/user/edit/30'); 
    $crawler = $client->submit($crawler->selectButton('submit')->form(array(
     'form[email]' => '[email protected]', 
    ))); 

    /* 
    * With this em, this work perfectly 
    * $em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
    */ 

    $user = self::$em->getRepository('MyBundle:User')->findUser('[email protected]'); 

    die(var_dump($user->getEmail())); 
} 

,這是我WebTestCase延伸原有WebTestCase:

class WebTestCase extends BaseWebTestCase 
{ 
    static protected $container; 
    static protected $em; 

    static protected function createClient(array $options = array(), array $server = array()) 
    { 
     $client = parent::createClient($options, $server); 
     self::$em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
     self::$container = $client->getContainer(); 

     return $client; 
    } 

    protected function createAuthClient($user, $pass) 
    { 
     return self::createClient(array(), array(
      'PHP_AUTH_USER' => $user, 
      'PHP_AUTH_PW' => $pass, 
     )); 
    } 

正如你所看到的,我替換自:: $ EM我創造我的時候客戶。

我的問題:

在我的測試中,die()給我的舊電子郵件,而不是已經在測試註冊新的電子郵件([email protected])。但是在我的數據庫中,我正確保存了[email protected]

當我在數據庫中檢索我的用戶時,我使用sefl::$em。如果我在評論中使用$em,我將檢索正確的新電子郵件。

我不明白,爲什麼在我的WebTestCase,我可以接觸到新的實體管理器...

+0

邊注:爲什麼地球上你死(的var_dump()),既不做的var_dump返回任何有用的事情,也不應該需要模具()在測試的中間。 – conny

回答

4

您不能訪問新的實體管理器,因爲每個請求之前的Symfony的客戶端類關閉的內核,意味着它會擦除整個服務容器並從頭開始重新構建它。

因此,在SECOND請求之後,您會得到與您在自己的WebTestCase類中擁有的實體管理器完全不同的實體管理器。 (我說的後第二,因爲只有當任何要求已經進行客戶端關機的內核)

的問題是 - 你真的需要在您的WebTestCase類相同的實體manafer?實際上,您可能希望使用相同的實體管理器,因爲您希望讓控制權交給請求之間的事務。但在這種情況下,您應該創建自己的測試客戶端類擴展symfony的,並且在那裏定義靜態連接或實體管理器,並在每個請求之前將其放入容器中。

看看例子: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

+0

非常感謝您寶貴的答覆。在這種情況下,我只想測試表單是否將新電子郵件保存在數據庫中。所以,你認爲最好的?創建我自己的測試客戶端,在每個請求之前放置實體管理器和容器?感謝您的幫助,我會繼續正常工作! – rgazelot

+2

如果你只想檢查是否正確添加的東西你爲什麼不直接使用不從默認的客戶端(在你沒有在你的評論片段的方式)實體管理器?我看不到任何需要保留實體管理器的實例。我用我自己的測試客戶端的情況下,我想例如檢查,如果新行被添加到數據庫,然後回滾事務(因爲我不希望我的測試修改數據庫)。 – Cyprian

+0

好的。我懂了。感謝您的幫助。我會盡力快速實施。 – rgazelot