최근 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
실패 두 문자열이 동등하다고 주장했다.
+++ 실제 @@ @@
을 예상
--- 고마워요! 다음과 같이 엔티티 관리자 개체의 새로 고침 방법을 사용하여 데이터를 다시로드를 강제
안녕 마테오. 그거였다! 고맙습니다! –