Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2] Różne wartości zwracania danych
Forum PHP.pl > Forum > PHP > Frameworki
Matrix12
Witam,



stworzyłem sobie serwis który chce aby rejestrował użytkownika. Chciałem przetestować metodę która weryfikuje czy użytkownik jest już w systemie, zwraca boola . Zrobiłem var_dump poprzez przeglądarkę i jak użytkownik istnieje zwraca mi jego obiekt a jeśli nie zwraca nulla.

Kod serwisu :



  1.  
  2. <?php
  3.  
  4. namespace Acme\UserBundle\Libs;
  5.  
  6.  
  7. use Doctrine\Bundle\DoctrineBundle\Registry;
  8. use Doctrine\ORM\EntityManager;
  9. use Symfony\Component\DependencyInjection\Container;
  10.  
  11. class RegisterTest
  12. {
  13.  
  14. public $doctrine;
  15. private $container;
  16.  
  17. /**
  18.   * @param $data
  19.   */
  20. public function __construct(Registry $doctrine)
  21. {
  22. $this->doctrine = $doctrine;
  23. }
  24.  
  25. public function checkUserExist($name)
  26. {
  27. $this->name = $name;
  28.  
  29. $user = $this->doctrine->getManager()->getRepository('AcmeUserBundle:User')->findOneBy(array(
  30. 'username'=>'m4ver'
  31. ));
  32.  
  33.  
  34. if(is_object($user) && !empty($user)){
  35. return true;
  36. }else{
  37. return false;
  38. }
  39.  
  40. }
  41.  
  42. }
  43.  




W przeglądarce var_dump zwraca mi true a spec false.. mimo że testuje tego samego użytkownika.. wiecie może dlaczego ?
destroyerr
Cytat
zwraca boola

Cytat
jak użytkownik istnieje zwraca mi jego obiekt a jeśli nie zwraca nulla

Cytat
zwraca mi true a spec false

Możesz się zdecydować co się tak naprawdę dzieje a co ma się dziać?
Jeżeli nie pokażesz testu to możemy sobie długo gdybać.
Matrix12
  1. <?php
  2.  
  3. namespace spec\Acme\UserBundle\Libs;
  4.  
  5. use PhpSpec\ObjectBehavior;
  6. use Prophecy\Argument;
  7. use Symfony\Component\DependencyInjection\Container;
  8. use Doctrine\Bundle\DoctrineBundle\Registry;
  9. use Doctrine\ORM\EntityRepository;
  10. use Doctrine\ORM\EntityManager;
  11. use Symfony\Component\HttpFoundation\Request;
  12.  
  13. use Symfony\Component\Routing\Router;
  14.  
  15. class RegisterTestSpec extends ObjectBehavior
  16. {
  17.  
  18. function let(Container $container, Registry $doctrine, EntityRepository $repository,EntityManager $entityManager, Request $request)
  19. {
  20. $container->get('doctrine')->willReturn($doctrine);
  21. $doctrine->getManager()->willReturn($entityManager);
  22. $entityManager->getRepository(Argument::any())->willReturn($repository);
  23.  
  24. $this->beConstructedWith($doctrine);
  25. }
  26. function it_is_initializable()
  27. {
  28. $this->shouldHaveType('Acme\UserBundle\Libs\RegisterTest');
  29. }
  30.  
  31. function it_check_user_exist_in_system()
  32. {
  33.  
  34. $this->checkUser('user1')->shouldReturn(true);
  35. }
  36.  
  37. }





kod
  1. <?php
  2.  
  3. namespace Acme\UserBundle\Libs;
  4.  
  5.  
  6. use Doctrine\Bundle\DoctrineBundle\Registry;
  7.  
  8.  
  9. class RegisterTest
  10. {
  11.  
  12. public $doctrine;
  13.  
  14. public function __construct(Registry $doctrine)
  15. {
  16. $this->doctrine = $doctrine;
  17. }
  18.  
  19.  
  20. public function checkUser($argument1)
  21. {
  22. try{
  23. $em = $this->doctrine->getManager();
  24. }catch(\Exception $e){
  25. return $e->getMessage();
  26. }
  27.  
  28.  
  29. $user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array(
  30. 'username'=>$argument1
  31. ));
  32.  
  33.  
  34. if(!$user){
  35. return false;
  36. }else{
  37. return true;
  38. }
  39. }
  40.  
  41.  
  42.  
  43. }
  44.  




jezeli skasuje tego ifa w kodzie i dam return $user to w przeglądarce daje obiekt, a jeżeli zostawie ifa daje mi boola true. Problem w tym że spec dalej false a jezeli w kodzie dam return $user daje null..
destroyerr
W RegisterTestSpec nie ustalasz co ma zwracać metoda findOneBy. Inna sprawa, że taki łańcuch zależności nie jest wskazany. Być może wystarczy dostarczać samo repozytorium, chyba, że w usłudze chcesz skorzystać z transakcji. Moim zdaniem powinieneś dostarczyć repozytorium i manedżera jako zależności.
Matrix12
Poradziłem sobie. Mam jednak takie pytanie z punktu widzenia "dobrych praktyk" Chce zapisać użytkownika do bazy.. i zastanawiam się czy w serwisie to zrobić czy w kontrolerze. A np. w serwisie nadać token do potwierdzenia takiego użytkownika hasować hasło wysłać potwierdzającego maila itd. a persist flush w controlerze.
destroyerr
Wszystko to robisz w usłudze. Włącznie z flushem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.