PHPUNIT - Тестирование обратного вызова, который является новым экземпляром класса - PullRequest
1 голос
/ 20 сентября 2019

У меня есть класс, который вызывает глобальную функцию WordPress 'add_menu_page'. Эта функция получает несколько аргументов, одним из которых является обратный вызов, который в этом случае создает новый экземпляр класса 'CreateAdminMountPoint'.

В моем тесте PHPUnit я смоделировал функцию admin_menu_page и ее ожидаемые аргументы 'with'.

Моя проблема заключается в классе обратного вызова, в моем тесте я установил утверждение:

array(new CreateAdminMountPoint(array('slug' => 'brands')), 'addMountPoint')

Это явно плохая практика, так как мой тест теперь основан на отдельном классе, а не изолированном тестировании.

Как я могу изменить свой тест, чтобы он не зависел от CreateAdminMountPoint?

Класс

class CreateAdminMenus {

    public function addMenuPages($tables) {      
      foreach( $tables as $menu ) {
        add_menu_page(
          $menu['title'],
          $menu['title'],
          $menu['wp-menu']['capability'],
          'pup/' . $menu['title'] . '/edit.php',
          [new CreateAdminMountPoint($menu), 'addMountPoint'], // Trying to test this without being dependant on CreatAdminMountPoint
          $menu['wp-menu']['icon']
        );
      } 
    }
}

Контрольный пример

class CreateAdminMenusTest extends LSMTestCase {

  protected function setup() {
    $this->tables = array(
      'brands' =>
      array(
        'title' => 'title',
        'slug' => 'brands',
        'wp-menu' =>
        array(
          'capability' => 'capability',
          'icon' => 'icon',
        ),
      ),
    );
  }

  public function testMenusAreCreated() {

    $adminMenus = new CreateAdminMenus;
    $mock = $this->mockGlobalFunction('add_menu_page');
    $mock->expects($this->exactly(1))
      ->method('add_menu_page')
      ->with(
        'title',
        'title',
        'capability',
        'pup/title/edit.php',
        array(new CreateAdminMountPoint(array('slug' => 'brands')), 'addMountPoint'),
        'icon'
      );

    $adminMenus->addMenuPages($this->tables);

  }

}

1 Ответ

0 голосов
/ 20 сентября 2019

То, как ваш код написан сейчас, невозможно проверить другим способом, чем вы делаете сейчас.Что на самом деле не так плохо, как вы думаете.Если бы я увидел такой тест в запросе на удаление, я бы одобрил его.

При этом я могу представить, что вы действительно хотите проверить это более тщательно.Ваше лучшее решение - использовать класс CreateAdminMountPointBuilder.Таким образом, вместо создания нового объекта, встроенного.Вы используете свой новый класс, чтобы построить его.Таким образом, вы можете смоделировать этот класс в своем тесте и утверждать, что смоделированный ответ от компоновщика вставляется в ваш вызов функции.

Теперь вы также можете повторно использовать конструктор, если хотите использовать его где-либо еще в вашем проекте.

Надеюсь, это имеет смысл, иначе я мог бы добавить пример кода.Дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...