{"id":229780,"date":"2022-11-27T14:34:00","date_gmt":"2022-11-27T11:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229780"},"modified":"2022-11-27T14:34:34","modified_gmt":"2022-11-27T11:34:34","slug":"pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-2-the-tear-down","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-2-the-tear-down\/","title":{"rendered":"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 2: The Tear Down"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-1-konfiguracja\/\" title=\"Pod koniec ubieg\u0142ego miesi\u0105ca\">Pod koniec ubieg\u0142ego miesi\u0105ca<\/a><\/strong> zacz\u0105\u0142em m\u00f3wi\u0107 o pisaniu test\u00f3w jednostkowych w PHPUnit dla kodu opartego na WordPressie. Dotyczy\u0142o to przede wszystkim pomys\u0142u skonfigurowania <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong>, <strong>funkcji setUp<\/strong> i pisania podstawowych test\u00f3w.<\/p>\n<p>Nie om\u00f3wi\u0142em jednak tego, co wiem o funkcji <strong>tearDown<\/strong>, kt\u00f3ra wci\u0105\u017c jest wa\u017cn\u0105 cech\u0105 pisania przy u\u017cyciu test\u00f3w. Co wi\u0119cej, s\u0105 te\u017c dwa sposoby rozwa\u017cenia pisania test\u00f3w dla projekt\u00f3w WordPress.<\/p>\n<p>Mianowicie:<\/p>\n<ol>\n<li>pisanie test\u00f3w specjalnie dla wtyczek i funkcjonalno\u015bci warstwy aplikacji,<\/li>\n<li>przeprowadzanie test\u00f3w jednostkowych aplikacji WordPress.<\/li>\n<\/ol>\n<p>Zanim jednak przejd\u0119 dalej z tym konkretnym postem, radz\u0119 nadrobi\u0107 zaleg\u0142o\u015bci o tym, co om\u00f3wi\u0142em do tej pory. Obejmuje to nast\u0119puj\u0105ce posty:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/srodowisko-programistyczne-wordpress-przy-uzyciu-menedzera-pakietow\/\" title=\"\u015arodowisko programistyczne WordPress (przy u\u017cyciu mened\u017cera pakiet\u00f3w)\">\u015arodowisko programistyczne WordPress (przy u\u017cyciu mened\u017cera pakiet\u00f3w)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/ide-do-programowania-wordpress-niezaleznie-od-doswiadczenia\/\" title=\"IDE do programowania WordPress\">IDE do programowania WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/praca-z-ustawieniami-uzytkownika-w-visual-studio-code\/\" title=\"Praca z ustawieniami u\u017cytkownika w Visual Studio Code\">Praca z ustawieniami u\u017cytkownika w Visual Studio Code<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-1-konfiguracja\/\" title=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja\">Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja<\/a><\/li>\n<\/ol>\n<p>Gdy to zrobisz, wr\u00f3\u0107 do tego postu i kontynuujmy omawianie funkcji tearDown i tego, jak faktycznie wygl\u0105daj\u0105 testy jednostkowe w kontek\u015bcie WordPressa.<\/p>\n<h2>Testy jednostkowe z PHPUnit, cz\u0119\u015b\u0107 2: The Tear Down<\/h2>\n<p>Zanim przejdziemy dalej, pami\u0119taj, \u017ce programi\u015bci cz\u0119sto traktuj\u0105 funkcj\u0119 <strong>setup<\/strong> jak konstruktor, a funkcj\u0119 <strong>tearDown<\/strong> jak destruktor; pami\u0119taj jednak, \u017ce to drugie nie zawsze jest potrzebne.<\/p>\n<p>Oto dobra praktyczna zasada do zapami\u0119tania:<\/p>\n<ul>\n<li>Wszystko, czego potrzebuje funkcja testowa, wywo\u0142a funkcj\u0119 <strong>setUp<\/strong>, aby potrzebne by\u0142y klasy.<\/li>\n<li>Funkcja <strong>tearDown<\/strong> nie zawsze jest potrzebna, poniewa\u017c funkcja <strong>setUp<\/strong> mo\u017ce ponownie zainicjowa\u0107 klas\u0119.<\/li>\n<\/ul>\n<p>Co to oznacza dla funkcji <strong>tearDown<\/strong>, je\u015bli nie resetuje ona danych utworzonych podczas funkcji <strong>konfiguracji<\/strong>? <\/p>\n<h3>1 Funkcja odrywania<\/h3>\n<p>Najlepsz\u0105 rad\u0105, jak\u0105 mog\u0119 udzieli\u0107 w zwi\u0105zku z funkcj\u0105 <strong>tearDown<\/strong>, jest to, \u017ce nale\u017cy jej u\u017cy\u0107, je\u015bli podczas jednego z test\u00f3w zostanie co\u015b ustawione.<\/p>\n<p>Mo\u017ce to by\u0107 co\u015b zapisanego w bazie danych, co\u015b zapisanego w dzienniku lub, bardziej og\u00f3lnie, co\u015b zapisanego na dysku twardym.<\/p>\n<p>Tak wi\u0119c, je\u015bli test zapisze rekord lub plik, metoda <strong>rozdzielania<\/strong> zostanie uruchomiona po te\u015bcie i powinna usun\u0105\u0107 wszystkie testy zapisane na dysku, kt\u00f3re nie s\u0105 cz\u0119\u015bci\u0105 testu, ale nie s\u0105 na sta\u0142e potrzebne w nast\u0119pnym te\u015bcie lub kt\u00f3re nale\u017cy po sobie posprz\u0105ta\u0107.<\/p>\n<p>W pewnym sensie to jest jak <strong><a href=\"http:\/\/en.cppreference.com\/w\/cpp\/language\/destructor\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">destruktor<\/a><\/strong>, ale je\u015bli nigdy nie u\u017cywa\u0142e\u015b j\u0119zyka, kt\u00f3ry ma destruktor, to nazewnictwo albo wydaje si\u0119 nieistotne, albo nie ma sensu.<\/p>\n<blockquote>\n<p>Destruktor <strong>to<\/strong> specjalna funkcja cz\u0142onkowska, kt\u00f3ra jest wywo\u0142ywana po zako\u0144czeniu okresu istnienia obiektu. Celem <strong>destruktora<\/strong> jest uwolnienie zasob\u00f3w, kt\u00f3re obiekt m\u00f3g\u0142 naby\u0107 podczas swojego \u017cycia.<\/p>\n<\/blockquote>\n<p>Dlatego mo\u017ce lepiej jest po prostu my\u015ble\u0107 o funkcji jako o sposobie sprz\u0105tania po te\u015bcie (a nie w sensie ustawiania zmiennej r\u00f3wnej null, poniewa\u017c funkcja <strong>setUp<\/strong> mo\u017ce to zrobi\u0107).<\/p>\n<h3>2 testy jednostkowe dla projekt\u00f3w WordPress<\/h3>\n<p>Pisz\u0105c testy jednostkowe dla projekt\u00f3w WordPress, musimy upewni\u0107 si\u0119, \u017ce mamy jasno\u015b\u0107 co do rodzaju test\u00f3w jednostkowych, o kt\u00f3rych m\u00f3wimy.<\/p>\n<p>Na przyk\u0142ad to, co b\u0119d\u0119 nazywa\u0142 klasycznymi lub standardowymi testami jednostkowymi, przebiega zgodnie z metodologi\u0105 \u201etest-driven development&quot;, o kt\u00f3rej za chwil\u0119 opowiem. Z drugiej strony WordPress ma w\u0142asny zestaw test\u00f3w jednostkowych dla motyw\u00f3w i tym podobnych, o kt\u00f3rych r\u00f3wnie\u017c opowiem nieco p\u00f3\u017aniej w tym po\u015bcie.<\/p>\n<p>Ale w tej sekcji pomy\u015bla\u0142em, \u017ce pomocne mo\u017ce by\u0107 om\u00f3wienie tego pierwszego, a nie drugiego, aby zobaczy\u0107, jak to mo\u017ce dzia\u0142a\u0107.<\/p>\n<p>W poni\u017cszym przyk\u0142adzie pisz\u0119 testy z wtyczk\u0105 odpowiedzialn\u0105 za komunikacj\u0119 z zewn\u0119trznym API. Ta konkretna wtyczka wymaga nazwy u\u017cytkownika i has\u0142a lub interfejsu API, <strong>a<\/strong> my chcemy si\u0119 upewni\u0107, \u017ce na potrzeby tego postu poprawnie pobiera b\u0142\u0105d za ka\u017cdym razem, gdy uruchamiany jest test.<\/p>\n<p>Zauwa\u017c, \u017ce czytaj\u0105c ten kod, zobaczysz, jak m\u00f3wi\u0119 troch\u0119 o refleksji. Nied\u0142ugo napisz\u0119 ca\u0142y post na temat PHP Reflection, wi\u0119c rzuc\u0119 na to troch\u0119 \u015bwiat\u0142a.<\/p>\n<p>W przypadku poni\u017cszego kodu za\u0142\u00f3\u017cmy jednak, \u017ce jest to spos\u00f3b, w jaki mo\u017cemy uzyska\u0107 dost\u0119p do w\u0142a\u015bciwo\u015bci, kt\u00f3re w inny spos\u00f3b s\u0105 oznaczone jako prywatne.<\/p>\n<p>Przypomnijmy z ostatniego posta z tej serii, mieli\u015bmy wst\u0119pny test, kt\u00f3ry wygl\u0105da\u0142 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-01-acme-cache-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeCacheTest extends TestCase\n{\n  protected $cache;\n\n  protected function setUp()\n  {\n    $this-&gt;cache = new AcmeCache();\n  }\n\n  public function testDefaultDuration()\n  {\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 43200);\n  }\n\n  public function testNewDuration()\n  {\n    $this-&gt;cache-&gt;setDuration(1000);\n\n    $this-&gt;assertFalse($this-&gt;cache-&gt;getDuration() === 43200);\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 1000);\n  }\n\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>Zauwa\u017c jednak, \u017ce w tym te\u015bcie nie ma funkcji <strong>tearDown<\/strong>, kt\u00f3ra ma sens, prawda? W ko\u0144cu nic nie jest zapisywane w bazie danych ani w pliku.<\/p>\n<p>Ale powiedzmy, \u017ce chcemy wprowadzi\u0107 przypadek testowy, kt\u00f3ry b\u0119dzie mia\u0142 nazw\u0119 pliku, zawarto\u015b\u0107 i zapisze zawarto\u015b\u0107 do pliku. W tym przypadku b\u0119d\u0105 to dane statyczne, ale technicznie mo\u017ce to by\u0107 wszystko, co zosta\u0142o zapisane na dysku.<\/p>\n<h4>1 Konfiguracja testu<\/h4>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ca4f83191255e661a84e3563b27263de#file-00-initial-set-up-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Najpierw<\/a><\/strong> chcemy skonfigurowa\u0107 test, definiuj\u0105c nazw\u0119 pliku, zawarto\u015b\u0107 pliku i przygotowuj\u0105c w\u0142a\u015bciwo\u015bci.<\/p>\n<pre><code>&lt;?php\n\nnamespace PresswareAcmeTestsAPI;\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeFileTest extends TestCase\n{\n\n  private $filename;\n\n  private $content;\n\n  public function setUp()\n  {\n    $this-&gt;filename = 'testFile.txt';\n    $this-&gt;content = 'This is a string of data that is meant to be written to the file.';\n  }\n\n  \/\/ More to come...\n}\n<\/code><\/pre>\n<p>Wystarczaj\u0105co \u0142atwe, prawda?<\/p>\n<h4>2 Zapis i odczyt danych<\/h4>\n<p>Nast\u0119pnie chcemy zapisa\u0107 dane, odczyta\u0107 dane i stwierdzi\u0107, \u017ce zawarto\u015b\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ca4f83191255e661a84e3563b27263de#file-01-testing-contents-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jest taka sama.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace PresswareAcmeTestsAPI;\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeFileTest extends TestCase\n{\n\n  private $filename;\n\n  private $content;\n\n  public function setUp()\n  {\n    $this-&gt;filename = 'testFile.txt';\n    $this-&gt;content = 'This is a string of data that is meant to be written to the file.';\n  }\n\n  public function testWriteReadData()\n  {    \n    \/\/ Writes the content to the file with the given filename.\n    $fileHandle = fopen($this-&gt;filename, 'w');\n    fwrite($fileHandle, $this-&gt;content);\n    fclose($fileHandle);\n\n    \/\/ Reads the contents of the file that was just written\n    $fileHandle = fopen($this-&gt;filename, 'r');\n    $contents = fread($fileHandle, filesize($this-&gt;filename));\n    fclose($fileHandle);\n\n    $this-&gt;assertSame($this-&gt;content, $contents);\n  }\n\n  \/\/ More to come..\n}\n<\/code><\/pre>\n<p>W tym momencie, je\u015bli uruchomisz test (kt\u00f3rego jeszcze technicznie nie om\u00f3wi\u0142em), zauwa\u017cysz, \u017ce <strong>testFile.txt<\/strong> nadal znajduje si\u0119 w twoim systemie.<\/p>\n<h4>3 Korzystanie z funkcji odrywania<\/h4>\n<p>Na koniec musimy popracowa\u0107 z metod\u0105 <strong>tearDown<\/strong>, aby upewni\u0107 si\u0119, \u017ce plik zostanie usuni\u0119ty po zako\u0144czeniu testu jednostkowego. <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ca4f83191255e661a84e3563b27263de#file-02-full-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Oto, jak mo\u017ce wygl\u0105da\u0107<\/a><\/strong>, je\u015bli zaimplementowa\u0142e\u015b kod w spos\u00f3b podobny do tego, kt\u00f3ry widzisz powy\u017cej.<\/p>\n<pre><code>&lt;?php\n\nnamespace PresswareAcmeTestsAPI;\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeFileTest extends TestCase\n{\n\n  private $filename;\n\n  private $content;\n\n  public function setUp()\n  {\n    $this-&gt;filename = 'testFile.txt';\n    $this-&gt;content = 'This is a string of data that is meant to be written to the file.';\n  }\n\n  public function testWriteReadData()\n  {    \n    \/\/ Writes the content to the file with the given filename.\n    $fileHandle = fopen($this-&gt;filename, 'w');\n    fwrite($fileHandle, $this-&gt;content);\n    fclose($fileHandle);\n\n    \/\/ Reads the contents of the file that was just written\n    $fileHandle = fopen($this-&gt;filename, 'r');\n    $contents = fread($fileHandle, filesize($this-&gt;filename));\n    fclose($fileHandle);\n\n    $this-&gt;assertSame($this-&gt;content, $contents);\n  }\n\n  public function tearDown()\n  {\n    if (file_exists($this-&gt;filename)) {\n      unlink($this-&gt;filename);\n    }\n  }\n}\n<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce w metodzie <strong>tearDown<\/strong> najpierw sprawdzam, czy <a href=\"https:\/\/php.net\/manual\/en\/function.file-exists.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">plik_istnieje<\/a>. Dzieje si\u0119 tak dlatego, \u017ce je\u015bli po prostu spr\u00f3bujesz <a href=\"https:\/\/php.net\/manual\/en\/function.unlink.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">od\u0142\u0105czy\u0107<\/a> plik, kt\u00f3ry nie jest obecny, otrzymasz b\u0142\u0105d podczas uruchamiania test\u00f3w, poniewa\u017c je\u015bli wyst\u0119puje <strong>funkcja tearDown<\/strong>, spr\u00f3buje usun\u0105\u0107 co\u015b po ka\u017cdej funkcji testowej. A je\u015bli plik nie istnieje, to nie ma nic do usuni\u0119cia, a co za tym idzie, spowoduje to problem.<\/p>\n<p>Wi\u0119c pr\u00f3buj\u0105c pisa\u0107 kod w spos\u00f3b defensywny, uwa\u017cam, \u017ce jest on odpowiedzialny za sprawdzenie, czy plik istnieje, zanim faktycznie spr\u00f3buje go usun\u0105\u0107.<\/p>\n<h3>3 Kolejno\u015b\u0107 Operacji<\/h3>\n<p>Je\u015bli chodzi o czyste testy jednostkowe, zwykle czytasz to w kontek\u015bcie <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Test-driven_development\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">programowania opartego na testach<\/a><\/strong>. To du\u017cy temat sam w sobie; jednak warto tutaj wspomnie\u0107, je\u015bli zdecydujesz si\u0119 na dalsze badania, a nawet wdro\u017cenie go w swoich wysi\u0142kach rozwojowych.<\/p>\n<p>Og\u00f3lna idea tego podej\u015bcia jest cz\u0119sto okre\u015blana jako \u201eczerwono-zielono-powt\u00f3rka&#8221;. I nie zaprzeczam, jest co\u015b w tym podej\u015bciu. Mianowicie, pozwala tobie, jako programi\u015bcie, pisa\u0107 kod tak, jak oczekujesz, \u017ce b\u0119dzie dzia\u0142a\u0142 przed faktycznym napisaniem kodu.<\/p>\n<p>Za tym stoi psychologia: je\u015bli wiesz, jak dzia\u0142a kod, masz wi\u0119ksze szanse na pisanie test\u00f3w, kt\u00f3re zdaj\u0105; maj\u0105c na uwadze, \u017ce je\u015bli piszesz testy, jak kod powinien dzia\u0142a\u0107, powiniene\u015b napisa\u0107 lepszy kod.<\/p>\n<p>Niestety nie zawsze mo\u017cemy sobie pozwoli\u0107 na ten luksus. Ale to nie znaczy, \u017ce powinni\u015bmy wyla\u0107 przys\u0142owiowe dziecko z wod\u0105. Zamiast tego jestem nastawiony na to, \u017ce powiniene\u015b pisa\u0107 testy, kiedy mo\u017cesz, a kod pisa\u0107 p\u00f3\u017aniej; w przeciwnym razie napisz testy po kodzie.<\/p>\n<p>Ostatecznie przeprowadzanie test\u00f3w niezale\u017cnie od tego b\u0119dzie lepsze ni\u017c ich brak.<\/p>\n<h3>4 Testowanie z WordPress<\/h3>\n<p>Je\u015bli chodzi o testowanie jednostkowe w WordPress, jest kilka rzeczy, na kt\u00f3re prawdopodobnie natkn\u0105\u0142e\u015b si\u0119. Czasami tre\u015b\u0107 jest myl\u0105ca lub mo\u017ce nawet wprowadza\u0107 w b\u0142\u0105d, je\u015bli chodzi o \u201etesty jednostkowe w WordPressie&#8221;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164139-61e75e67162bf.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-164139-61e75e67162bf.png\" alt=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 2: The Tear Down\"><\/a><\/p>\n<p>Na przyk\u0142ad warto zwr\u00f3ci\u0107 uwag\u0119 na dwie rzeczy:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Theme_Unit_Test\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Test jednostkowy tematu<\/a><\/strong>. Ten konkretny zestaw tre\u015bci ma na celu pom\u00f3c tw\u00f3rcom motyw\u00f3w przetestowa\u0107 wszystkie g\u0142\u00f3wne i mniejsze przypadki dla ich motyw\u00f3w. Nie ma na przyk\u0142ad zautomatyzowanych narz\u0119dzi, kt\u00f3rych mo\u017cna u\u017cywa\u0107 w spos\u00f3b opisany powy\u017cej.<\/li>\n<li><strong><a href=\"https:\/\/make.wordpress.org\/core\/handbook\/testing\/automated-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Testowanie automatyczne<\/a><\/strong>. WordPress jest dostarczany z w\u0142asnym zestawem test\u00f3w jednostkowych, dzi\u0119ki czemu nie musimy pisa\u0107 test\u00f3w dla wi\u0119kszo\u015bci funkcji WordPressa (np. czy funkcje API dzia\u0142aj\u0105 zgodnie z oczekiwaniami). To pozwala nam skupi\u0107 si\u0119 na pisaniu test\u00f3w jednostkowych dla naszej w\u0142asnej logiki domeny.<\/li>\n<li><strong><a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/plugin-unit-tests\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Testy jednostkowe wtyczek<\/a><\/strong>. Je\u015bli korzysta\u0142e\u015b z WP-CLI (lub jeste\u015b nim zainteresowany), prawdopodobnie przeczyta\u0142e\u015b t\u0119 stron\u0119 lub nawet u\u017cy\u0142e\u015b tego narz\u0119dzia. Jest to przydatne, ale dotyczy r\u00f3wnie\u017c konkretnych aspekt\u00f3w testowania wtyczek WordPress.<\/li>\n<\/ol>\n<p>Wszystkie powy\u017csze informacje s\u0105 u\u017cyteczn\u0105 informacj\u0105 i nie twierdz\u0119, \u017ce nale\u017cy je zignorowa\u0107. Zamiast tego powinien by\u0107 po\u0142\u0105czony z reszt\u0105 informacji wykorzystanych w tym po\u015bcie.<\/p>\n<h2>Przeprowadzanie test\u00f3w jednostkowych<\/h2>\n<p>W nast\u0119pnym po\u015bcie przeprowadz\u0119 Ci\u0119 przez wszystko, co musisz wiedzie\u0107, aby skonfigurowa\u0107 plik XML, kt\u00f3ry poinformuje PHPUnit, gdzie znajduj\u0105 si\u0119 testy i jak je uruchomi\u0107.<\/p>\n<p>Na razie jednak przejrzyj kod zawarty w tym po\u015bcie i przygotuj si\u0119 do zbudowania go w nast\u0119pnym po\u015bcie z tej serii.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Samouczek dotycz\u0105cy pisania test\u00f3w jednostkowych, kt\u00f3re prawid\u0142owo wykorzystuj\u0105 metody setUp i tearDown PHPUnit.<\/p>\n","protected":false},"author":1,"featured_media":164140,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,805,845],"tags":[1169],"class_list":["post-229780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229780"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229780\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164140"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}