✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

Pohjustus PHP:n heijastuksesta (ja miten se toimii yksikkötestauksessa)

17

Viime viikkoina olen kirjoittanut sivuston jäsenten yksikkötestauksesta (ja jostain, mitä aion jatkaa seuraavassa postauksessa). Se on jotain, mitä ajattelen; jos kirjoitat palvelinpuolen koodia, sinun pitäisi tehdä.

Tietysti minun on helpompi sanoa se kuin tehdä se, joten vaikka yritän varmistaa, että teen sen hyvin, minulla on aina parantamisen varaa. Sanon sen enemmän henkilökohtaisena vatsatarkastuksena kuin minkään muuna, joten poikkean.

Yksi testauksen aikana usein esiin nousevista käsitteistä on ajatus yksityisten attribuuttien arvojen testaamisesta. Oletetaan esimerkiksi, että sinulla on setteri, mutta sinulla ei välttämättä ole getteriä kyseiselle arvolle.

On helppo sanoa "No, sitten sinun on kirjoitettava getteri", mutta näin ei aina ole. Entä jos tallennat luokkaan tietoja, joita ei tarvitse altistaa kolmannen osapuolen luokille?

Kuinka meidän sitten pitäisi kirjoittaa testejä tällaisille tiedoille, kun haluamme käyttää niitä, mutta meillä ei ole siihen mahdollisuutta emmekä halua vaarantaa työmme eheyttä?

Siellä heijastus tulee peliin.

Heijastus PHP:ssä

Tarkemmin sanottuna ymmärtääksesi kuinka tarkastaa tietyn muuttujan arvo ulkopuolelta sisään, sinun on osattava käyttää heijastusta.

Onneksi PHP tarjoaa meille tehokkaan API:n tätä varten, ja on luultavasti syytä perehtyä sen syviin yksityiskohtiin toisessa viestissä. Mutta tässä tapauksessa pysyy perusasioissa.

Toimiva määritelmä

Ensinnäkin, katso mitä reflektio tarkoittaa. PHP-käsikirja määrittelee sen seuraavasti :

ReflectionClass – luokka raportoi luokan tietoja.

Mutta mielestäni kannattaa ottaa jotain hieman vankkaampaa. Jatketaanpa tähän postaukseen jotain tällaista:

Heijastus on tapa, jolla ohjelma tarkastaa itsensä ja muuttaa itseään ajon aikana.

Ehkä se ei ole hienoa; ehkä ei.

Pohjustus PHP:n heijastuksesta (ja miten se toimii yksikkötestauksessa)

Mutta se palvelee tämän postauksen tarkoitusta.

Arvon lukeminen heijastuksen kautta

Oletetaan, että tätä viestiä varten sinulla on nimitilaluokka AcmePluginAPIClientissä ja sillä on ominaisuus nimeltä username. Katsotaan myöhemmin, miltä tämän yksinkertainen toteutus saattaa näyttää.

Tietysti se olisi paljon konkretisoitunut todellisessa laajennuksessa.

Oletetaan kuitenkin, että haluat asettaa attribuutin arvon ja sitten lukea sen arvon. Varoitus on, että omaisuus on merkitty yksityiseksi, eikä sitä voi lukea ulkopuolelta.

Tässä pohdiskelu on hyödyllistä. Toisin sanoen voimme käyttää osaa ohjelmasta katsoaksemme itseään ja raportoidaksemme näkemästään. (Reflektio, ymmärrätkö sen? Se on kuin silloin, kun haluamme tietää, mitä itsellämme on, eikä ketään muuta ole lähellä, joten katsomme peiliin ja katsomme, mitä siellä on.)

Tätä varten sinun on tehtävä viisi asiaa:

  1. Esitä luokka, jota haluat testata,
  2. Aseta muuttujan arvo,
  3. Ota ReflectionClass -esiintymä sille luokalle, jonka haluat testata,
  4. Aseta sen omaisuus esteettömäksi,
  5. Lue arvo.

Joten tässä on sarja sisältöjä, jotka tarjoavat tarvittavat vaiheet juuri sen tekemiseen.

1 Toteuta luokka

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  // Other functions for class implementation...
}

2 Aseta arvo

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

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

  // Other functions for class implementation...
}

3 Esitä heijastuneet objektit

<?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. Aseta ominaisuus, merkitse se esteettömäksi

<?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 Lue arvo

<?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);
  }
}

Ja se on heijastuksen perusalusta

Tässä vaiheessa tämän pitäisi antaa sinulle perustietoa siitä, mitä Reflection on, kuinka sitä käytetään ja miksi se on hyödyllinen erityisesti yksikkötestauksen yhteydessä .

Tämä on yksi niistä käsitteistä, jotka voivat olla monimutkaisempia, koska PHP:n heijastussovellusliittymä on melko tehokas (mutta suhteellisen helppo ymmärtää). Kun yhdistät sen yksikkötestaukseen, on kuitenkin paljon asioita, joita voidaan tehdä.

Minun häpeämätön pistoke

Tästä huolimatta, jos olet kiinnostunut tällaisten asioiden yksityiskohdista, älä epäröi tutustua sivuston vain jäsenille tarkoitettuun alueeseen. Luon joka viikko ruuhkaa tavaraa, joka auttaa meitä keskittymään parempien käytäntöjen omaksumiseen WordPress-kehittäjinä.

Yksikkötestaus, heijastus ja paljon muuta ovat vain sen viimeisin osa.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja