{"id":230537,"date":"2022-11-28T16:26:00","date_gmt":"2022-11-28T13:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230537"},"modified":"2022-11-09T22:50:49","modified_gmt":"2022-11-09T19:50:49","slug":"pohjustus-php-n-heijastuksesta-ja-miten-se-toimii-yksikkoetestauksessa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/pohjustus-php-n-heijastuksesta-ja-miten-se-toimii-yksikkoetestauksessa\/","title":{"rendered":"Pohjustus PHP:n heijastuksesta (ja miten se toimii yksikk\u00f6testauksessa)"},"content":{"rendered":"\n<p>Viime viikkoina olen kirjoittanut sivuston <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4senten<\/a><\/strong> <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yksikk\u00f6testauksesta<\/a><\/strong> (ja jostain, mit\u00e4 aion jatkaa seuraavassa postauksessa). Se on jotain, mit\u00e4 ajattelen; jos kirjoitat palvelinpuolen koodia, sinun pit\u00e4isi tehd\u00e4.<\/p>\n<p>Tietysti minun on helpompi sanoa se kuin tehd\u00e4 se, joten vaikka yrit\u00e4n varmistaa, ett\u00e4 teen sen hyvin, minulla on aina parantamisen varaa. Sanon sen enemm\u00e4n henkil\u00f6kohtaisena vatsatarkastuksena kuin mink\u00e4\u00e4n muuna, joten poikkean.<\/p>\n<p>Yksi testauksen aikana usein esiin nousevista k\u00e4sitteist\u00e4 on ajatus yksityisten attribuuttien arvojen testaamisesta. Oletetaan esimerkiksi, ett\u00e4 sinulla on setteri, mutta sinulla ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 ole getteri\u00e4 kyseiselle arvolle.<\/p>\n<p>On helppo sanoa &quot;No, sitten sinun on kirjoitettava getteri&quot;, mutta n\u00e4in ei aina ole. Ent\u00e4 jos tallennat luokkaan tietoja, joita ei tarvitse altistaa kolmannen osapuolen luokille?<\/p>\n<p>Kuinka meid\u00e4n sitten pit\u00e4isi kirjoittaa testej\u00e4 t\u00e4llaisille tiedoille, kun haluamme k\u00e4ytt\u00e4\u00e4 niit\u00e4, mutta meill\u00e4 ei ole siihen mahdollisuutta emmek\u00e4 halua vaarantaa ty\u00f6mme eheytt\u00e4?<\/p>\n<p>Siell\u00e4 heijastus tulee peliin.<\/p>\n<h2>Heijastus PHP:ss\u00e4<\/h2>\n<p>Tarkemmin sanottuna ymm\u00e4rt\u00e4\u00e4ksesi kuinka tarkastaa tietyn muuttujan arvo ulkopuolelta sis\u00e4\u00e4n, sinun on osattava k\u00e4ytt\u00e4\u00e4 heijastusta.<\/p>\n<p>Onneksi PHP tarjoaa meille tehokkaan API:n t\u00e4t\u00e4 varten, ja on luultavasti syyt\u00e4 perehty\u00e4 sen syviin yksityiskohtiin toisessa viestiss\u00e4. Mutta t\u00e4ss\u00e4 tapauksessa pysyy perusasioissa.<\/p>\n<h3>Toimiva m\u00e4\u00e4ritelm\u00e4<\/h3>\n<p>Ensinn\u00e4kin, katso mit\u00e4 reflektio tarkoittaa. PHP-k\u00e4sikirja <strong><a href=\"https:\/\/php.net\/manual\/en\/class.reflectionclass.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00e4\u00e4rittelee sen seuraavasti<\/a><\/strong> :<\/p>\n<blockquote>\n<p><strong>ReflectionClass<\/strong> &#8211; luokka raportoi luokan tietoja.<\/p>\n<\/blockquote>\n<p>Mutta mielest\u00e4ni kannattaa ottaa jotain hieman vankkaampaa. Jatketaanpa t\u00e4h\u00e4n postaukseen jotain t\u00e4llaista:<\/p>\n<blockquote>\n<p>Heijastus on tapa, jolla ohjelma tarkastaa itsens\u00e4 ja muuttaa itse\u00e4\u00e4n ajon aikana.<\/p>\n<\/blockquote>\n<p>Ehk\u00e4 se ei ole hienoa; ehk\u00e4 ei.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164036-61e75c7d26d26.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164036-61e75c7d26d26.png\" alt=\"Pohjustus PHP:n heijastuksesta (ja miten se toimii yksikk\u00f6testauksessa)\" ><\/a><\/p>\n<p>Mutta se palvelee t\u00e4m\u00e4n postauksen tarkoitusta.<\/p>\n<h3>Arvon lukeminen heijastuksen kautta<\/h3>\n<p>Oletetaan, ett\u00e4 t\u00e4t\u00e4 viesti\u00e4 varten sinulla on nimitilaluokka <strong>AcmePluginAPIClientiss\u00e4<\/strong> ja sill\u00e4 on ominaisuus nimelt\u00e4 <strong>username<\/strong>. Katsotaan my\u00f6hemmin, milt\u00e4 t\u00e4m\u00e4n yksinkertainen toteutus saattaa n\u00e4ytt\u00e4\u00e4.<\/p>\n<p>Tietysti se olisi paljon konkretisoitunut todellisessa laajennuksessa.<\/p>\n<p>Oletetaan kuitenkin, ett\u00e4 haluat asettaa attribuutin arvon ja sitten lukea sen arvon. Varoitus on, ett\u00e4 omaisuus on merkitty <strong>yksityiseksi<\/strong>, eik\u00e4 sit\u00e4 voi lukea ulkopuolelta.<\/p>\n<p>T\u00e4ss\u00e4 pohdiskelu on hy\u00f6dyllist\u00e4. Toisin sanoen voimme k\u00e4ytt\u00e4\u00e4 osaa ohjelmasta katsoaksemme itse\u00e4\u00e4n ja raportoidaksemme n\u00e4kem\u00e4st\u00e4\u00e4n. (Reflektio, ymm\u00e4rr\u00e4tk\u00f6 sen? Se on kuin silloin, kun haluamme tiet\u00e4\u00e4, mit\u00e4 itsell\u00e4mme on, eik\u00e4 ket\u00e4\u00e4n muuta ole l\u00e4hell\u00e4, joten katsomme peiliin ja katsomme, mit\u00e4 siell\u00e4 on.)<\/p>\n<p>T\u00e4t\u00e4 varten sinun on teht\u00e4v\u00e4 viisi asiaa:<\/p>\n<ol>\n<li>Esit\u00e4 luokka, jota haluat testata,<\/li>\n<li>Aseta muuttujan arvo,<\/li>\n<li><strong>Ota ReflectionClass<\/strong> -esiintym\u00e4 sille luokalle, jonka haluat testata,<\/li>\n<li>Aseta sen omaisuus esteett\u00f6m\u00e4ksi,<\/li>\n<li>Lue arvo.<\/li>\n<\/ol>\n<p>Joten t\u00e4ss\u00e4 on sarja sis\u00e4lt\u00f6j\u00e4, jotka tarjoavat tarvittavat vaiheet juuri sen tekemiseen.<\/p>\n<h4>1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-00-apiclient-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Toteuta luokka<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePlugin;\n\nclass APIClient\n{\n  private $username;\n\n  \/\/ Other functions for class implementation...\n}\n<\/code><\/pre>\n<h4>2 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-01-setusername-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Aseta arvo<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePlugin;\n\nclass APIClient\n{\n  private $username;\n\n  public function setUsername($username)\n  {\n    $this-&gt;username = $username;\n  }\n\n  \/\/ Other functions for class implementation...\n}\n<\/code><\/pre>\n<h4>3 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-01-apiclienttest-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Esit\u00e4 heijastuneet objektit<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n\n    \/\/ More to come...\n  }\n}\n<\/code><\/pre>\n<h4>4. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-02-setaccessibleproperty-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Aseta ominaisuus, merkitse se esteett\u00f6m\u00e4ksi<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n    $usernameProperty = new ReflectionObject($client);\n    $usernameProperty-&gt;setAccessible(true);\n\n    \/\/ More to come...\n  }\n}\n<\/code><\/pre>\n<h4>5 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-03-readpropertyvalue-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lue arvo<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n\n    \/\/ Grab a reference to the private property by making it accessible.\n    $usernameProperty = new ReflectionObject($client);\n    $usernameProperty-&gt;setAccessible(true);\n\n    \/\/ And finally, read it's value.\n    $usernameValue = $usernameProperty-&gt;getValue($client);\n  }\n}\n<\/code><\/pre>\n<h2>Ja se on heijastuksen perusalusta<\/h2>\n<p>T\u00e4ss\u00e4 vaiheessa t\u00e4m\u00e4n pit\u00e4isi antaa sinulle perustietoa siit\u00e4, mit\u00e4 Reflection on, kuinka sit\u00e4 k\u00e4ytet\u00e4\u00e4n ja miksi se on hy\u00f6dyllinen erityisesti <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yksikk\u00f6testauksen<\/a><\/strong> yhteydess\u00e4 .<\/p>\n<p>T\u00e4m\u00e4 on yksi niist\u00e4 k\u00e4sitteist\u00e4, jotka voivat olla monimutkaisempia, koska PHP:n heijastussovellusliittym\u00e4 on melko tehokas (mutta suhteellisen helppo ymm\u00e4rt\u00e4\u00e4). Kun yhdist\u00e4t sen yksikk\u00f6testaukseen, on kuitenkin paljon asioita, joita voidaan tehd\u00e4.<\/p>\n<h3>Minun h\u00e4pe\u00e4m\u00e4t\u00f6n pistoke<\/h3>\n<p>T\u00e4st\u00e4 huolimatta, jos olet kiinnostunut t\u00e4llaisten asioiden yksityiskohdista, \u00e4l\u00e4 ep\u00e4r\u00f6i tutustua sivuston <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vain j\u00e4senille<\/a><\/strong> tarkoitettuun alueeseen. Luon joka viikko <strong><a href=\"https:\/\/tommcfarlin.com\/members-only-content\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ruuhkaa tavaraa<\/a><\/strong>, joka auttaa meit\u00e4 keskittym\u00e4\u00e4n parempien k\u00e4yt\u00e4nt\u00f6jen omaksumiseen WordPress-kehitt\u00e4jin\u00e4.<\/p>\n<p>Yksikk\u00f6testaus, heijastus ja paljon muuta ovat vain sen viimeisin osa.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP:n reflektoinnin perusteiden ymm\u00e4rt\u00e4minen voi helpottaa ohjelmointia, erityisesti testausta, paljon.<\/p>\n","protected":false},"author":1,"featured_media":164037,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,803],"tags":[1166],"class_list":["post-230537","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-php-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230537"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230537\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164037"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}