Как правильно протестировать метод, вызываемый перехватчиком действия
-
29-09-2020 - |
Вопрос
Конструктор в моем классе добавляет действие к перехвату действия 'init':
class My_Custom_Post_Type {
function __construct( $type ) {
$this->type = $type;
add_action( 'init', array( $this, 'register_my_type' );
}
function register_my_type() {
register_post_type( $this->type);
}
}
Я пытался протестировать это в модульном тестировании и, наконец, понял, что не было никаких причин для срабатывания хука действия 'init'.Есть ли какой-нибудь способ проверить, вызывается ли метод register_my_type и регистрируется ли новый тип записи?
Редактировать:
Основной источник моего замешательства возник из-за непонимания взаимосвязи между phpunit, набором тестов WordPress, моим кодом класса и моим тестовым кодом.
Что я теперь понимаю, так это то, что с помощью инструментов разработчика WordPress, установленных так, как предложено этот учебник или через WP-CLI, призыв к phpunit
загружает загрузочный файл, который затем подключает плагин к muplugins_loaded
крюк действия.Затем загрузочный файл загружает тестовую среду WordPress.После того, как WordPress завершит загрузку init
крюк запущен.Код плагина, который использует init
должно работать так, как ожидалось.
Тесты - это в основном просто обычный код, который использует доступные функции или классы.Что отличает их, так это то , что они написаны как методы класса , который расширяет WP_UnitTestCase
который расширяет PHPUnit_Framework_TestCase
.Будучи заключенным в этот класс, тесты получают доступ к утверждениям и фабрикам объектов и выполняются setUp
и tearDown
методы, позволяющие каждому тесту быть независимым от других.
Решение
Позвольте мне начать с того, что init
Экшен является вызывается при загрузке WordPress, перед запуском тестов.Итак, у вас загружается ваш плагин / тема с WordPress (путем подключения к muplugins_loaded
, например), в register_my_type()
метод должен быть вызван, если ваш конструктор вызывается до init
.(Если вы не загружаете свой плагин таким образом, взгляните на этот учебник.)
Итак, в ваших модульных тестах вы должны быть в состоянии сделать это:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
Вы также могли бы использовать get_post_type()
чтобы проверить, что тип записи был зарегистрирован с правильными аргументами.(Это то же самое, что я делаю, чтобы проверить, зарегистрированы ли мои шорткоды.)
Я бы не стал беспокоиться о попытке проверить, что метод был вызван, хотя вы могли бы проверить список действий в $wp_actions
чтобы проверить, правильно ли он подключен.Вы также могли бы установить свойство класса в качестве флага при его вызове, но я действительно думаю, что все это излишне.Когда дело доходит до вещей, связанных с такими действиями, как init
, особенно для такой функции, как эта, которую нужно запустить только один раз, функциональные тесты - ваш лучший выбор.Убедитесь, что они сделали то, что должны были сделать, вместо того, чтобы сосредотачиваться на попытке протестировать отдельный модуль, например, был ли вызван метод.
Тем не менее, вы также можете проверить, что метод регистрирует тип записи, отменяя регистрацию типа записи и вручную вызывая метод.WordPress, похоже, не предоставляет deregister_post_type()
функции, так что вам пришлось бы возиться с $wp_post_types
глобальный напрямую.Вы могли бы удалить свой тип записи из этого, а затем вызвать свой метод и проверить, зарегистрирован ли он снова.