Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][SF2]Testowanie serwisu
Matrix12
post
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 22.03.2015

Ostrzeżenie: (0%)
-----


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ść.
Go to the top of the page
+Quote Post
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Matrix12
post
Post #3





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 22.03.2015

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #4





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


$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
Go to the top of the page
+Quote Post
Matrix12
post
Post #5





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 22.03.2015

Ostrzeżenie: (0%)
-----


  1.  
  2. Czyli test ma wyglądać tak :
  3.  
  4. $this->registerUser(Argument::type('Symfony\Component\Http\Form))->willReturn(true)


Go to the top of the page
+Quote Post
destroyerr
post
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
Matrix12
post
Post #7





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 22.03.2015

Ostrzeżenie: (0%)
-----


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 ?

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 16:15