2016-10-12 9 views
1

최근 TDD를 시작했고 Symfony 3, Doctrine 2, Fixtures 및 WebTestCase를 사용하여 기능 테스트를 작성했습니다. 내가 프로필을 편집 할 수 있습니다 위해 (JWT와) 로그인해야 있도록하는 RESTfull API의 편집 기능에 대한 테스트입니다(Symfony 3/Doctrine 2)은 Chagens를 저장하지만 WebTestCase에서 가져 오지 못합니다.

CONTEXT : 어제, 나는 내 테스트에서 이상한 행동을 발견했다. 그게 내 setUp 함수에서하는 일입니다. (JWT-) 토큰은 업데이트하려는 변경 사항과 함께 편집 컨트롤러로 보내집니다. 그것은 매력처럼 작동합니다.

문제 2 데이터베이스에서 업데이트 된 값을 가져 와서 내가 보낸 값과 비교할 때 문제가 발생합니다. 그들은 동일해야하지만, 그렇지 않습니다 ... 가장 이상한 것은 쿼리를 필터링하여 비교할 값과 비교한다는 것입니다. 즉,이 값이있는 데이터베이스에 행이 있으면 비교할 동일한 값을 가져야합니다.

내 LoadUserData.php

namespace BackendBundle\DataFixtures\ORM; 

use BackendBundle\Entity\User; 
use Doctrine\Common\DataFixtures\FixtureInterface; 
use Doctrine\Common\Persistence\ObjectManager; 

class LoadUserData implements FixtureInterface 
{ 
    static public $users = array(); 

    /** 
    * {@inheritDoc} 
    */ 
    public function load(ObjectManager $manager) 
    { 
     $user = new User(); 
     $user->setUsername('User1'); 
     $user->setEmail('[email protected]'); 
     $user->setPassword('user1'); 
     $user->setDateValidFrom(new \DateTime('2016-10-11 12:22:25')); 
     $user->setProfilePicture('test.jpg'); 
     $user->setDateValidTo(new \DateTime('2016-10-11 12:22:25')); 
     $user->setDateLastEdited(new \DateTime('2016-10-11 12:22:25')); 
     $user->setUsergroup(null); 

     $user2 = new User(); 
     $user2->setUsername('User2'); 
     $user2->setEmail('[email protected]'); 
     $user2->setPassword('user2'); 
     $user2->setDateValidFrom(new \DateTime('2016-10-11 12:22:25')); 
     $user2->setProfilePicture('test.jpg'); 
     $user2->setDateValidTo(new \DateTime('2016-10-11 12:22:25')); 
     $user2->setDateLastEdited(new \DateTime('2016-10-11 12:22:25')); 
     $user2->setUsergroup(null); 

     $manager->persist($user); 
     $manager->persist($user2); 

     $manager->flush(); 


     self::$users = array($user, $user2); 

    } 
} 

내 UserControllerTest.php 시험의

namespace tests\BackendBundle\Controller; 


use BackendBundle\DataFixtures\ORM\LoadUserData; 
use BackendBundle\Entity\User; 
use Liip\FunctionalTestBundle\Test\WebTestCase; 

class UserControllerTest extends WebTestCase 
{ 

    private $jwtService; 
    private $jwt; 
    private $userRep; 
    private $currentUser; 

    public function setUp(){ 
     $this->jwtService = $this->getContainer()->get('app.jwt_auth'); 
     $this->userRep = $this->getContainer()->get('doctrine')->getManager() 
      ->getRepository('BackendBundle:User'); 


     $fixtures = array('BackendBundle\DataFixtures\ORM\LoadUserData'); 
     $this->loadFixtures($fixtures); 
     $users = LoadUserData::$users; 
     /** @var User $user */ 
     $user = $users[0]; 
     $this->currentUser = $user; 

     ************* THE USER HAVE TO BE LOGGED TO CAN EDIT HIS PROFILE ****************** 
     $this->jwt = $this->jwtService->signup(
      $user->getEmail(), 
      $user->getPassword(), 
      true 
     ); 
     $this->client = static::createClient(); 
    } 

    public function testEditAction() { 

     $route = $this->getUrl(
      'edit', 
      array(
       'authorization' => $this->jwt, 
       'json' => '{"email":"[email protected]","username":"admin","password":"admin"}', 
       '_format' => 'json' 
      ) 
     ); 
     $this->client->request('POST', $route, array('ACCEPT' => 'application/json')); 
     $response = $this->client->getResponse(); 


     **************** GET THE USER WITH THE NEW EMAIL **************** 
     /** @var User $updatedUser */ 
     $updatedUser = $this->userRep->findOneBy( 
      array('email' => '[email protected]') 
     ); 
     ************* COMPARE NEW EMAIL WITH THE SENT ONE *********** 
     $this->assertEquals($updatedUser->getEmail(), '[email protected]'); 
    } 
} 

결과 : BackendBundle \ 컨트롤러 \ UserControllerTest \

1) 시험 :: testEditAction

실패 두 문자열이 동등하다고 주장했다.

+++ 실제 @@ @@

-'[email protected] '

+'[email protected]'

을 예상

--- 고마워요! 다음과 같이 엔티티 관리자 개체의 새로 고침 방법을 사용하여 데이터를 다시로드를 강제

답변

1

시도 :

**************** GET THE USER WITH THE NEW EMAIL **************** 
    /** @var User $updatedUser */ 
    $updatedUser = $this->userRep->findOneBy( 
     array('email' => '[email protected]') 
    ); 

    $em = $this->getContainer()->get('doctrine')->getManager(); 
    $em->refresh($updatedUser); 

    ************* COMPARE NEW EMAIL WITH THE SENT ONE *********** 
    $this->assertEquals($updatedUser->getEmail(), '[email protected]'); 

희망이 도움

+0

안녕 마테오. 그거였다! 고맙습니다! –