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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/160567

  •  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 глобальный напрямую.Вы могли бы удалить свой тип записи из этого, а затем вызвать свой метод и проверить, зарегистрирован ли он снова.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top