Mój serwis ma zapisywać użytkownika do bazy, w między czasie ma sprawdzić czy taki użytkownik już istnieje i ewentualnie go zapisać wysłać maila z potwierdzeniem rejestracji. Chce to przetestować.
Mój kod wygląda tak :
<?php
namespace Acme\UserBundle\Libs;
use Acme\UserBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\ORM\EntityManager;
class RegisterTest
{
public $doctrine;
public function __construct(Registry $doctrine)
{
$this->doctrine = $doctrine;
}
public function checkUser($argument1)
{
try{
$em = $this->doctrine->getManager();
}catch(\Exception $e){
return $e->getMessage();
}
$user = $em->getRepository('CustomUserBundle:User')->findOneBy(array( 'username'=>$argument1
));
if(!$user){
return false;
}else{
return true;
}
}
public function register($argument1)
{
$data = $argument1->getData();
$user = new User;
try{
$user->setName($data->getUsername());
$user->setEmail($data->getEmail());
/* i inne settery */
$this->doctrine->getManager()->persist($user);
$this->doctrine->getManager()->flush();
}catch(\Exception $e){
}
}
}
spec do niego :
<?php
namespace spec\Acme\UserBundle\Libs;
use Acme\UserBundle\Entity\User;
use Doctrine\Common\Persistence\ObjectRepository;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Symfony\Component\DependencyInjection\Container;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Router;
class RegisterTestSpec extends ObjectBehavior
{
function let(Container $container, Registry $doctrine, EntityRepository $repository,EntityManager $entityManager, Request $request)
{
$container->get('doctrine')->willReturn($doctrine);
$doctrine->getManager()->willReturn($entityManager);
$entityManager->getRepository(Argument::any())->willReturn($repository);
$this->beConstructedWith($doctrine);
}
function it_is_initializable()
{
$this->shouldHaveType('Acme\UserBundle\Libs\RegisterTest');
}
function it_check_user_exist_in_system_when_user_exist_in_system(Registry $doctrine, ObjectRepository $repository, User $user)
{
$doctrine->getManager()->willReturn($doctrine);
$doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
$repository->findOneBy(array('username'=>'user1'))->willReturn($user);
$this->checkUser('user1')->shouldReturn(true);
}
function it_check_user_exist_in_system_when_user_not_exist_in_system(Registry $doctrine, ObjectRepository $repository, User $user)
{
$doctrine->getManager()->willReturn($doctrine);
$doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
$repository->findOneBy(array('username'=>'user123312312'))->willReturn(null);
$this->checkUser('user123312312')->shouldReturn(false);
}
function it_register_user(Registry $doctrine, ObjectRepository $repository,EntityManager $entityManager , User $user, FormConfigBuilder $form)
{
$doctrine->getManager()->willReturn($doctrine);
// $doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
$siteClass = Argument::exact('Acme\UserBundle\Entity\User')->getValue();
$site = new $siteClass;
$doctrine->getManager()->persist($site)->shouldBeCalled();
$doctrine->getManager()->flush()->shouldBeCalled();
// $entityManager->persist($site)->shouldBeCalled();
// $entityManager->flush()->shouldBeCalled();
$this->register($form)->shouldReturn(true);
}
}
Problem miałem z sprawdzeniem użytkownika, ale poradziłem sobie teraz mam problem z perystencją. Chce spradzić czy użytkownik się zapiszę do bazy. Spec zwraca mi niby 100 % ale wywala też bład
Fatal error: Call to undefined method Prophecy\Prophecy\MethodProphecy::persist() in /var/www/example/spec/Acme/UserBundle/Libs/RegisterTestSpec.php on line 70 i nie wiem czy to do końca dobry test..
Czy powinienem używac setterów encji ? czy jest jakaś inna opcja obejścia tego ?