У меня есть класс, который вызывает глобальную функцию 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);
}
}