2012-10-10 23 views
5

Tôi gặp sự cố với Trình quản lý đối tượng trong phpunit.Sự cố với Trình quản lý thực thể và phpunit trong Symfony 2

Đây là thử nghiệm của tôi:

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())); 
} 

và đây là WebTestCase của tôi kéo dài WebTestCase gốc:

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, 
     )); 
    } 

Như bạn thấy đấy, tôi thay thế tự :: $ em khi tôi tạo của tôi khách hàng.

Vấn đề của tôi:

Trong thử nghiệm của tôi, các die() cho tôi email cũ và không phải là email mới ([email protected]) đã đăng ký trong các thử nghiệm. Tuy nhiên trong cơ sở dữ liệu của tôi, tôi đã lưu [email protected] chính xác.

Khi tôi truy xuất người dùng của mình trong cơ sở dữ liệu, tôi sử dụng sefl::$em. Nếu tôi sử dụng các chú thích $em, tôi sẽ nhận được email mới phù hợp.

Tôi không hiểu tại sao trong WebTestCase của tôi, tôi có thể truy cập vào các Entity Manager mới ...

+0

Side lưu ý: Tại sao trên trái đất làm bạn chết (var_dump()), không phải làm var_dump trở lại bất cứ điều gì hữu ích, cũng không phải bạn nên cần phải chết() ở giữa một bài kiểm tra. – conny

Trả lời

4

Bạn không thể truy cập cho người quản lý thực thể mới vì kernel Symfony của lớp khách hàng tắt máy trước khi mỗi yêu cầu, trong đó có nghĩa là nó xóa toàn bộ vùng chứa dịch vụ và xây dựng lại nó từ đầu.

Vì vậy, sau khi SECOND yêu cầu, bạn có trình quản lý thực thể rất khác so với người bạn có trong lớp WebTestCase của riêng bạn. (Tôi đã nói sau giây vì hạt nhân của máy khách tắt máy chỉ khi có yêu cầu nào đã được thực hiện)

Câu hỏi đặt ra là - bạn có thực sự cần manafer cùng một thực thể trong lớp WebTestCase của bạn không? Trên thực tế, bạn có thể muốn sử dụng cùng một trình quản lý thực thể vì bạn muốn cho phép nói kiểm soát giao dịch giữa các yêu cầu. Nhưng trong trường hợp này, bạn nên tạo lớp client thử nghiệm của riêng bạn mở rộng một lớp của symfony và xác định kết nối tĩnh hoặc trình quản lý thực thể, và đặt nó vào thùng chứa trước mỗi yêu cầu.

Nhìn vào ví dụ: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

+0

Cảm ơn bạn rất nhiều vì câu trả lời có giá trị của bạn. Trong trường hợp này, tôi chỉ muốn kiểm tra xem biểu mẫu đã lưu email mới trong cơ sở dữ liệu chưa. Vì vậy, muốn là tốt nhất trong ý kiến ​​của bạn? Tạo ứng dụng thử nghiệm của riêng tôi để đặt trình quản lý đối tượng và vùng chứa trước mọi yêu cầu? Cảm ơn sự giúp đỡ của bạn, tôi sẽ tiếp tục hoạt động chính xác! – rgazelot

+2

Nếu bạn chỉ muốn kiểm tra xem một cái gì đó đã được thêm chính xác tại sao bạn không chỉ sử dụng trình quản lý thực thể từ ứng dụng khách mặc định (theo cách bạn đã làm trong đoạn trích nhận xét của mình)? Tôi không thể thấy bất kỳ nhu cầu nào về việc giữ bản sao của người quản lý thực thể. Tôi sử dụng thử nghiệm của riêng khách hàng của tôi trong tình huống mà tôi muốn ví dụ kiểm tra xem hàng mới đã được thêm vào db VÀ sau đó giao dịch rollback (vì tôi không muốn cơ sở dữ liệu kiểm tra sửa đổi của tôi). – Cyprian

+0

Ok. Tôi hiểu rồi. Cảm ơn sự giúp đỡ của bạn. Tôi sẽ cố gắng thực hiện điều này một cách nhanh chóng. – rgazelot

Các vấn đề liên quan