Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2]Testowanie serwisu
Forum PHP.pl > Forum > PHP > Frameworki
Matrix12
Chce napisać dla testów rejestracje użytkownika. Ma być to osobny serwis, rejestracja wygląda w następujący sposób:

1. Kontroler przekazuje dane z formularza do serwisu register do metordy registerUser($data)
2. Metoda waliduje te dane, generuje token dla tego użytkownika, hashuje hasło, przesyła maila do użytkownika w celu potwierdzenia rejestracji.

Problem w tym, że nie wiem jak napisać speca do tej metody.. Nie wiem jak wyodrębnić poszczególne elementy do testowania..
Bo nie powinno być to przecież $this->registerUser($form->getData())->shouldReturn(true);





Będę wdzięczny za wszelkie wskazówki jak do tego podejść.
destroyerr
Napiszę, że nie powinieneś mieć dla tej metody jednego testu tylko wiele. Powinieneś mieć pewność, że są wykorzystywane zależności, które muszą być wywołane. Sprawdź czy metoda rzuca wyjątkami wtedy kiedy trzeba. Sprawdź wartość zwracaną (o ile coś zwracasz). Nie wiem co robi metoda registerUser więc nie mogę napisać precyzyjnie.
Matrix12
Masz rację tylko mam problem z testem integracyjnym.. że końcowy test przetestuje mi cały proces.. w niej ma być tylko $this->registerUser($dane)->shouldReturn(true)? Wiem że każdy element mam testować osobno ale potem tak integracyjnie jak to przetestować.
kpt_lucek
$this->registerUser($form->getData())->shouldReturn(true);

To mi raczej wygląda na test jednostkowy...

Mając mockowane $form->getData() musisz dodać expects, returnValue etc
Testując metodę swojego obiektu robisz self::assert{typAssertu} etc. poczytaj
Matrix12
  1.  
  2. Czyli test ma wyglądać tak :
  3.  
  4. $this->registerUser(Argument::type('Symfony\Component\Http\Form))->willReturn(true)


destroyerr
Skąd mamy wiedzieć jak ma wyglądać test, skoro nawet nie wiemy co Twój kod ma robić? Druga sprawa, ustalmy o jakim teście piszesz.
Jeśli chcesz pomocy to przedstaw publiczny interfejs obiektów które chcesz przetestować razem z zależnościami. Następnie pokaż spójne testy (jedna linijka mi nic nie mówi).
Matrix12
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 :
  1.  
  2. <?php
  3.  
  4. namespace Acme\UserBundle\Libs;
  5.  
  6.  
  7. use Acme\UserBundle\Entity\User;
  8. use Doctrine\Bundle\DoctrineBundle\Registry;
  9. use Doctrine\ORM\EntityManager;
  10.  
  11.  
  12. class RegisterTest
  13. {
  14.  
  15. public $doctrine;
  16.  
  17. public function __construct(Registry $doctrine)
  18. {
  19. $this->doctrine = $doctrine;
  20. }
  21.  
  22.  
  23.  
  24. public function checkUser($argument1)
  25. {
  26.  
  27. try{
  28. $em = $this->doctrine->getManager();
  29. }catch(\Exception $e){
  30. return $e->getMessage();
  31. }
  32.  
  33.  
  34. $user = $em->getRepository('CustomUserBundle:User')->findOneBy(array(
  35. 'username'=>$argument1
  36. ));
  37.  
  38. if(!$user){
  39. return false;
  40. }else{
  41. return true;
  42. }
  43. }
  44.  
  45.  
  46.  
  47.  
  48. public function register($argument1)
  49. {
  50.  
  51. $data = $argument1->getData();
  52. $user = new User;
  53. try{
  54. $user->setName($data->getUsername());
  55. $user->setEmail($data->getEmail());
  56. /* i inne settery */
  57. $this->doctrine->getManager()->persist($user);
  58. $this->doctrine->getManager()->flush();
  59. }catch(\Exception $e){
  60. echo $e->getMessage();
  61. }
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68. }
  69. }




spec do niego :
  1. <?php
  2.  
  3. namespace spec\Acme\UserBundle\Libs;
  4.  
  5. use Acme\UserBundle\Entity\User;
  6. use Doctrine\Common\Persistence\ObjectRepository;
  7. use PhpSpec\ObjectBehavior;
  8. use Prophecy\Argument;
  9. use Symfony\Component\DependencyInjection\Container;
  10. use Doctrine\Bundle\DoctrineBundle\Registry;
  11. use Doctrine\ORM\EntityRepository;
  12. use Doctrine\ORM\EntityManager;
  13. use Symfony\Component\Form\Form;
  14. use Symfony\Component\Form\FormConfigBuilder;
  15. use Symfony\Component\HttpFoundation\Request;
  16.  
  17. use Symfony\Component\Routing\Router;
  18.  
  19. class RegisterTestSpec extends ObjectBehavior
  20. {
  21.  
  22. function let(Container $container, Registry $doctrine, EntityRepository $repository,EntityManager $entityManager, Request $request)
  23. {
  24. $container->get('doctrine')->willReturn($doctrine);
  25. $doctrine->getManager()->willReturn($entityManager);
  26. $entityManager->getRepository(Argument::any())->willReturn($repository);
  27.  
  28. $this->beConstructedWith($doctrine);
  29. }
  30. function it_is_initializable()
  31. {
  32. $this->shouldHaveType('Acme\UserBundle\Libs\RegisterTest');
  33. }
  34.  
  35.  
  36.  
  37.  
  38.  
  39. function it_check_user_exist_in_system_when_user_exist_in_system(Registry $doctrine, ObjectRepository $repository, User $user)
  40. {
  41.  
  42. $doctrine->getManager()->willReturn($doctrine);
  43. $doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
  44.  
  45. $repository->findOneBy(array('username'=>'user1'))->willReturn($user);
  46.  
  47. $this->checkUser('user1')->shouldReturn(true);
  48. }
  49.  
  50.  
  51. function it_check_user_exist_in_system_when_user_not_exist_in_system(Registry $doctrine, ObjectRepository $repository, User $user)
  52. {
  53. $doctrine->getManager()->willReturn($doctrine);
  54. $doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
  55.  
  56. $repository->findOneBy(array('username'=>'user123312312'))->willReturn(null);
  57.  
  58. $this->checkUser('user123312312')->shouldReturn(false);
  59. }
  60.  
  61. function it_register_user(Registry $doctrine, ObjectRepository $repository,EntityManager $entityManager , User $user, FormConfigBuilder $form)
  62. {
  63. $doctrine->getManager()->willReturn($doctrine);
  64. // $doctrine->getRepository('CustomUserBundle:User')->willReturn($repository);
  65.  
  66.  
  67. $siteClass = Argument::exact('Acme\UserBundle\Entity\User')->getValue();
  68. $site = new $siteClass;
  69.  
  70. $doctrine->getManager()->persist($site)->shouldBeCalled();
  71. $doctrine->getManager()->flush()->shouldBeCalled();
  72. // $entityManager->persist($site)->shouldBeCalled();
  73. // $entityManager->flush()->shouldBeCalled();
  74.  
  75. $this->register($form)->shouldReturn(true);
  76. }
  77. }
  78.  
  79.  




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 ?

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.