✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Elementarz do refleksji w PHP (i jak to się sprawdza w testach jednostkowych)

114

Od kilku tygodni piszę o testach jednostkowych dla członków serwisu (i coś, co planuję kontynuować w następnym poście). To jest coś, o czym myślę; jeśli piszesz kod po stronie serwera, powinieneś to robić.

Oczywiście łatwiej mi to powiedzieć, niż zrobić, więc chociaż staram się, aby dobrze to robiłem, zawsze jest miejsce na poprawę. Mówię to bardziej jako osobista intuicja niż cokolwiek innego, więc robię dygresję.

Jedną z koncepcji, która często pojawia się podczas testowania, jest idea testowania wartości atrybutów prywatnych. Załóżmy na przykład, że masz setter, ale niekoniecznie masz getter dla tej konkretnej wartości.

Łatwo jest powiedzieć „Cóż, w takim razie musisz napisać getter", ale nie zawsze tak jest. Mam na myśli to, że przechowujesz pewne informacje w klasie, które nie muszą być udostępniane klasom firm trzecich?

Jak więc mamy pisać testy na tego rodzaju danych, kiedy chcemy uzyskać do nich dostęp, ale nie mamy do tego możliwości i nie chcemy naruszać integralności naszej pracy?

I tu pojawia się refleksja.

Refleksja w PHP

W szczególności, aby zrozumieć, jak sprawdzić wartość danej zmiennej z zewnątrz, trzeba wiedzieć, jak korzystać z odbicia.

Na szczęście PHP dostarcza nam do tego potężne API i prawdopodobnie warto zagłębić się w szczegóły w innym poście. Ale w tym przypadku pozostanie przy podstawach.

Robocza definicja

Najpierw spójrz na to, co oznacza odbicie. Podręcznik PHP definiuje to jako :

Klasa ReflectionClass raportuje informacje o klasie.

Ale myślę, że warto mieć coś bardziej solidnego. Przejdźmy z czymś takim przynajmniej do tego postu:

Refleksja to sposób, w jaki program sprawdza się i modyfikuje w czasie wykonywania.

Może to nie jest świetne; może nie.

Elementarz do refleksji w PHP (i jak to się sprawdza w testach jednostkowych)

Ale to będzie służyć temu poście.

Odczytywanie wartości poprzez refleksję

Załóżmy, że w tym poście masz klasę przestrzeni nazw w AcmePluginAPIClient i posiada ona właściwość nazwaną username. Później przyjrzymy się, jak bardzo podstawowa implementacja tego może wyglądać.

Oczywiście byłoby to znacznie bardziej rozbudowane w rzeczywistej wtyczce.

Powiedzmy jednak, że chcesz ustawić wartość atrybutu, a następnie odczytać jego wartość. Zastrzeżenie polega na tym, że nieruchomość jest oznaczona jako prywatna i nie ma możliwości odczytania jej z zewnątrz.

Tutaj przydaje się refleksja. Oznacza to, że możemy użyć części programu, aby spojrzeć na siebie i zgłosić to, co widzi. (Odbicie, rozumiesz? To tak, jakbyśmy chcieli wiedzieć, co się dzieje z nami i nikogo innego nie ma w pobliżu, więc patrzymy w lustro i widzimy, co tam jest.)

Aby to zrobić, musisz zrobić pięć rzeczy:

  1. Utwórz instancję klasy, którą chcesz przetestować,
  2. Ustaw wartość zmiennej,
  3. Pobierz instancję ReflectionClass dla klasy, którą chcemy przetestować,
  4. Ustaw jego właściwość na dostęp,
  5. Przeczytaj wartość.

Oto szereg elementów, które dostarczą kroków niezbędnych do tego.

1 Utwórz instancję klasy

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  // Other functions for class implementation...
}

2 Ustaw wartość

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  public function setUsername($username)
  {
    $this->username = $username;
  }

  // Other functions for class implementation...
}

3 tworzenie odbitych obiektów

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // More to come...
  }
}

4. Ustaw właściwość, oznacz ją jako dostępną

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // More to come...
  }
}

5 Przeczytaj wartość

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // Grab a reference to the private property by making it accessible.
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // And finally, read it's value.
    $usernameValue = $usernameProperty->getValue($client);
  }
}

I to jest podstawowy elementarz refleksji

W tym momencie powinno to dać ci kilka podstawowych informacji na temat tego, czym jest Reflection, jak z niego korzystać i dlaczego jest przydatny zwłaszcza w przypadku testów jednostkowych.

Jest to jedna z tych koncepcji, która może stać się bardziej złożona, ponieważ API refleksji PHP jest dość potężne (ale stosunkowo łatwe do zrozumienia). Kiedy jednak połączysz to z testowaniem jednostkowym, możesz zrobić wiele rzeczy.

Moja bezwstydna wtyczka

Mając to na uwadze, jeśli jesteś zainteresowany nauką tajników tego rodzaju rzeczy, nie wahaj się sprawdzić tylko dla członków obszaru witryny. Każdego tygodnia tworzę zaległości, które pomogą nam skupić się na przyjęciu lepszych praktyk jako programiści WordPress.

Testy jednostkowe, refleksje i nie tylko to tylko najnowsza część tego.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów