Viimased paar nädalat olen kirjutanud saidi liikmete ühikutestimisest (ja millestki, mida kavatsen järgmises postituses jätkata). See on midagi, mida ma arvan; kui kirjutate serveripoolset koodi, peaksite seda tegema.
Muidugi on mul lihtsam seda öelda kui teha, nii et kuigi ma püüan olla kindel, et teen seda hästi, on mul alati arenguruumi. Ütlen seda pigem isikliku kõhukontrolli kui millegi muuna, seega kaldun kõrvale.
Üks kontseptsioon, mis testimise käigus sageli esile kerkib, on privaatsete atribuutide väärtuste testimise idee. Oletame näiteks, et teil on setter, kuid teil pole tingimata selle konkreetse väärtuse jaoks getterit.
Lihtne on öelda: "Noh, siis peate kirjutama getteri", kuid see ei ole alati nii. Mis saab siis, kui salvestate klassis teavet, mida ei pea kolmandate osapoolte klassidele kokku puutuma?
Kuidas me siis peaksime kirjutama teste selliste andmete vastu, kui tahame neile juurde pääseda, kuid meil pole selleks võimalust ega soovi oma töö terviklikkust kahjustada?
Siin tulebki mängu peegeldus.
Peegeldus PHP-s
Täpsemalt, selleks, et mõista, kuidas antud muutuja väärtust väljastpoolt sissepoole kontrollida, peate teadma, kuidas kasutada peegeldust.
Õnneks pakub PHP meile selleks võimsat API-t ja tõenäoliselt tasub selle sügavamatesse üksikasjadesse sattuda mõnes teises postituses. Kuid selle puhul jään põhitõdede juurde.
Töötav definitsioon
Kõigepealt vaadake, mida peegeldamine tähendab. PHP käsiraamat määratleb selle järgmiselt :
Klass ReflectionClass annab teavet klassi kohta.
Aga ma arvan, et tasub võtta midagi veidi soliidsemat. Teeme vähemalt selle postituse jaoks midagi sellist:
Peegeldus on viis, kuidas programm ennast tööajal kontrollib ja muudab.
Võib-olla pole see suurepärane; võibolla mitte.
Kuid see täidab selle postituse eesmärki.
Väärtuse lugemine peegelduse kaudu
Oletame, et selle postituse jaoks on teil AcmePluginAPIClientis nimeruumide klass ja sellel on atribuut nimega kasutajanimi. Vaatame hiljem, milline võib selle väga lihtne teostus välja näha.
Muidugi oleks see tegelikus pistikprogrammis palju täpsem.
Oletame aga, et soovite määrata atribuudi väärtuse ja seejärel lugeda selle väärtust. Hoiatus on see, et vara on märgitud privaatseks ja seda pole võimalik väljastpoolt lugeda.
Siin tulebki peegeldus kasuks. See tähendab, et saame kasutada programmi osa, et vaadata ennast ja teatada, mida see näeb. (Peegeldus, saad aru? See on nagu siis, kui tahame teada, mis meiega toimub ja kedagi teist pole läheduses, nii et vaatame peeglisse ja vaatame, mis seal on.)
Selleks peate tegema viit asja:
- Looge klass, mida soovite testida,
- Määra muutuja väärtus,
- Haarake ReflectionClassi eksemplar selle klassi jaoks, mida tahame testida,
- Määrake selle omadus juurdepääsetavaks,
- Lugege väärtust.
Nii et siin on rida põhitõdesid, mis pakuvad täpselt selle tegemiseks vajalikke samme.
1 Esitage klass
<?php
namespace AcmePlugin;
class APIClient
{
private $username;
// Other functions for class implementation...
}
2 Määrake väärtus
<?php
namespace AcmePlugin;
class APIClient
{
private $username;
public function setUsername($username)
{
$this->username = $username;
}
// Other functions for class implementation...
}
3 Peegeldavate objektide kordus
<?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. Määrake atribuut, märkige see juurdepääsetavaks
<?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 Lugege väärtust
<?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 see on peegelduse põhiaabits
Siin peaks see andma teile põhiteavet selle kohta, mis on Reflection, kuidas seda kasutada ja miks see kasulik on, eriti ühikutestimise puhul .
See on üks neist mõistetest, mis võib muutuda keerulisemaks, kuna PHP refleksiooni API on üsna võimas (kuid suhteliselt kergesti mõistetav). Kuid kui ühendate selle üksuse testimisega, saab teha palju asju.
Minu häbematu pistik
Sellegipoolest, kui olete huvitatud seda tüüpi asjade läbimõtlemisest, vaadake kindlasti saidi liikmetele mõeldud ala. Kogun igal nädalal mahajäämust, mis aitab meil keskenduda WordPressi arendajate paremate tavade omaksvõtmisele.
Üksuse testimine, peegeldus ja palju muud on vaid selle uusim osa.
