✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Початок роздумів у PHP (і як це впливає на модульне тестування)

26

Протягом останніх кількох тижнів я писав про модульне тестування для учасників сайту (і те, що я планую продовжити робити в наступній публікації). Це те, що я думаю; якщо ви пишете код на стороні сервера, ви повинні це робити.

Звичайно, мені легше це сказати, ніж зробити, тому, хоча я намагаюся бути впевненим, що роблю це добре, мені завжди є куди вдосконалюватися. Я кажу це більше як особисту перевірку нутра, ніж будь-що інше, тому я відволікаюся.

Однією з концепцій, які часто виникають під час тестування, є ідея перевірки значень приватних атрибутів. Наприклад, припустимо, що у вас є сетер, але необов’язково є геттер для цього конкретного значення.

Легко сказати «Ну, тоді вам потрібно написати геттер», але це не завжди так. Я маю на увазі, що якщо ви зберігаєте деяку інформацію в класі, яку не потрібно надавати стороннім класам?

Як тоді ми маємо писати тести проти таких даних, коли ми хочемо отримати до них доступ, але не маємо можливості це зробити і не хочемо скомпрометувати цілісність нашої роботи?

Ось де в гру вступає рефлексія.

Рефлексія в PHP

Зокрема, щоб зрозуміти, як перевірити значення даної змінної ззовні, ви повинні знати, як використовувати відображення.

На щастя, PHP надає нам потужний API для цього, і, ймовірно, варто детально розповісти про це в іншій публікації. Але, для цього, ми будемо дотримуватися основ.

Робоче визначення

По-перше, подивіться, що означає рефлексія. У посібнику PHP це визначається так :

Клас ReflectionClass повідомляє інформацію про клас.

Але я вважаю, що варто мати щось більш надійне. Давайте принаймні для цієї публікації щось подібне:

Рефлексія – це те, як програма перевіряє себе та змінює себе під час виконання.

Можливо, це не чудово; можливо, не.

Початок роздумів у PHP (і як це впливає на модульне тестування)

Але це буде служити меті цієї публікації.

Читання значення за допомогою рефлексії

Припустімо, що для цієї публікації у вас є клас просторів імен у AcmePluginAPIClient і він має властивість під назвою ім’я користувача. Пізніше ми розглянемо, як може виглядати базова реалізація цього.

Звичайно, це було б набагато детальніше у справжньому плагіні.

Припустімо, однак, що ви хочете встановити значення атрибута, а потім прочитати його значення. Застереження полягає в тому, що власність позначена як приватна, і її неможливо прочитати ззовні.

Тут на допомогу приходить рефлексія. Тобто ми можемо використати частину програми, щоб подивитися на себе та повідомити про те, що вона бачить. (Віддзеркалення, зрозуміло? Це як коли ми хочемо знати, що з нами, а поруч нікого немає, ми дивимося в дзеркало і бачимо, що там.)

Для цього вам потрібно зробити п’ять речей:

  1. Створіть екземпляр класу, який ви хочете перевірити,
  2. Установіть значення змінної,
  3. Візьміть екземпляр ReflectionClass для класу, який ми хочемо перевірити,
  4. Встановіть його властивість на доступний,
  5. Прочитайте значення.

Отже, ось низка суті, яка забезпечить кроки, необхідні для виконання саме цього.

1 Створіть екземпляр класу

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  // Other functions for class implementation...
}

2 Встановіть значення

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

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

  // Other functions for class implementation...
}

3 Створення екземплярів відображених об’єктів

<?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. Встановіть властивість, позначте її як доступну

<?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 Прочитайте значення

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

І це базовий посібник із рефлексії

На цьому етапі це повинно дати вам базову інформацію про те, що таке Reflection, як ним користуватися та чому він корисний, особливо у випадку модульного тестування.

Це одна з тих концепцій, які можуть стати складнішими, оскільки API відображення PHP досить потужний (але відносно простий для розуміння). Однак, якщо поєднати це з модульним тестуванням, можна зробити багато речей.

My Shameless Plug

З огляду на це, якщо ви зацікавлені в тому, щоб дізнатися про тонкощі такого роду речей, не соромтеся перевірити область сайту лише для членів. Щотижня я створюю невиконані матеріали, щоб допомогти нам зосередитися на застосуванні кращих практик як розробників WordPress.

Модульне тестування, рефлексія та інше – лише остання частина цього.

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі