• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHPUnit + Symfony - testowanie fabryki z zależnością w konstruktorze

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
523 wizyt
pytanie zadane 6 września 2020 w PHP przez XiverKi Bywalec (2,050 p.)
edycja 6 września 2020 przez XiverKi

Dzień dobry,

Stworzyłem fabryke, która tworzy encje użytkownika na podstawie danych, które przekazywane są w obiekcie typu DTO 

Nie do końca jestem przekonany co do poprawności kodu tego testu, chętnie przyjmę wskazówkic o można by było poprawić.


Kod testu:

public function testShouldCreateUserObjectFromUserDto()
    {
        //Given
        /**
         * @var UserDto $userDto
         */
        $userDto = $this->getMockBuilder(UserDto::class)->getMock();
        $userDto->email = 'admin@admin';
        $userDto->plainPassword = '12345';
        $userDto->roles = ["ROLE_USER"];

        $passwordEncoderMock = $this->getMockBuilder(
            \Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface::class
        )->getMock();

        $passwordEncoderMock->expects($this->any())
        ->method('encodePassword')
        ->willReturn('encodedPassword');

        //When
        $userFactory = new UserFactory($passwordEncoderMock);
        $user = $userFactory->create($userDto);

        //Then
        $this->assertInstanceOf(User::class, $user);
    }

 

2 odpowiedzi

0 głosów
odpowiedź 7 września 2020 przez Ehlert Ekspert (215,010 p.)
wybrane 9 września 2020 przez XiverKi
 
Najlepsza
  1. Tak jak napisał Assasz, warto tworzyć normalne dto podczas takiego testu. Polecam wzorzec ObjectMother. Tworzysz klasę ze statystycznymi metodami które będą budować takie dto z uzupełnionymi wartościami w zależności od kontekstu.
  2. Return hint załatwi sprawę.
  3. Do tworzenia Mocków świetnie nadaje się Mockery. Warto przetestować.
  4. Używaj use, aby nie korzystać z całych namespace'ow w kodzie.
  5. Przepisanie odpowiedni wartości z dto to rzecz trywialna, ale może warto zweryfikować czy user po utworzeniu ma poprawny status wink jeśli taki jest to zastanów się czy nie jest to istotne dla Twojego systemu.
+2 głosów
odpowiedź 7 września 2020 przez Assasz Nałogowiec (30,460 p.)

1. Nie musisz mockować takich obiektów jak DTO. Po prostu stwórz nowy obiekt i poustawiaj jego własności.

2. Prawdopodobnie nie musisz sprawdzać typu obiektu zwracanego przez Twoją fabrykę (metoda create powinna mieć ustawiony typ zwracany, aczkolwiek nie widzę kodu tej fabryki). Zamiast tego sprawdź, jakie wartości posiada obiekt stworzonego usera, np.:

$this->assertSame($user->getEmail(), $userDto->email);

3. expects($this->any()) jest zazwyczaj zbędnę. Używaj metody expects tylko wtedy, kiedy rzeczywiście spodziewasz się wywołania metody określoną liczbę razy (albo nigdy).

4. $this->getMockBuilder()->getMock() możesz skrócić do $this->createMock().

komentarz 7 września 2020 przez XiverKi Bywalec (2,050 p.)

Chciałem użyć $this->createMock().  ale przy próbie użycia otrzymuje informacji o tym, że nie istnieje

komentarz 7 września 2020 przez Assasz Nałogowiec (30,460 p.)
komentarz 7 września 2020 przez XiverKi Bywalec (2,050 p.)
Faktycznie istnieje i nawet działa... moje ide ostatnio dziwne rzeczy pokazuje

Podobne pytania

0 głosów
0 odpowiedzi 164 wizyt
pytanie zadane 15 stycznia 2020 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 10 stycznia 2020 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
1 odpowiedź 766 wizyt
pytanie zadane 9 stycznia 2020 w PHP przez michal_php Stary wyjadacz (13,700 p.)

93,432 zapytań

142,428 odpowiedzi

322,661 komentarzy

62,796 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...