Как проверить, что плагин Wordpress активирован в приемочном тесте Codeception - PullRequest
1 голос
/ 19 сентября 2019

Я учусь писать плагин в Wordpress и хочу проверить, как плагин ведет себя, когда он активирован.Я использую Codeception / Wp-Browser в качестве структуры TDD.Я намерен написать приемочный тест с использованием модуля WpWebDriver с Chrome.

Проблема заключается в том, что написанные мной тесты мешают друг другу.По этой причине мне нужно сбросить состояние плагина перед каждым тестом, но я не знаю, как это сделать.

Перед каждым тестом мне нужно:

  • проверить, активен ли плагин
  • , если он есть, затем отключить его
  • , если он естьнет, то ничего не делать

Я знаю, что могу использовать метод _before внутри класса Cest.Вот мой код:

<?php
class activationCest
{
    public function _before(AcceptanceTester $I)
    {        
        // what to do here???
    }

    public function _after(AcceptanceTester $I)
    {
    }

    // tests
    public function activationCaseFailPHP(AcceptanceTester $I)
    {
        $I->wantTo('see an error message if the PHP version 
                    is not compatible with the plugin');

        $I->loginAsAdmin();
        $I->amOnPluginsPage();
        $I->activatePlugin('testwidget');

        $I->see('Your PHP version is outdated. 
                 Testwidget requires a PHP version equal or superior
                 to 7.0. Contact your hosting provider about 
                 how to update PHP');
    }

    public function activationCaseFailWP(AcceptanceTester $I)
    {
        $I->wantTo('see an error message if the Wordpress version
                    is not compatible with the plugin');

        $I->loginAsAdmin();
        $I->amOnPluginsPage();
        $I->activatePlugin('testwidget');

        $I->see('Your Wordpress version is outdated. 
                 Testwidget requires a Wordpress version equal 
                 or superior to 5.0. Contact your hosting provider
                 about how to update Wordpress');
    }

    public function activationCaseSuccess(AcceptanceTester $I)
    {
        $I->wantTo('see a success message if the PHP and Wordpress versions are 
                    compatible with the plugin');

        $I->loginAsAdmin();
        $I->amOnPluginsPage();
        $I->activatePlugin('testwidget');

        $I->see('Selected plugins activated', '#message');
    }
}

Наивно, я пробовал это

public function _before(AcceptanceTester $I)
    {        
       if (is_plugin_active('testwidget')) {
          $I->deactivatePlugin('testwidget');
       }
    }

Конечно, это не сработало.Программа выдала ошибку: [Error] Call to undefined function is_plugin_active(), потому что функция Wordpress is_plugin_active не находится в области действия.

Документация Codeception гласит: условные утверждения - этоесть методы типа canSeeElement или cantSeeElement, используемые для проверки того, что элемент находится на странице и не остановит проверку, если они не пройдут.Кажется, что-то похожее для действий Codeception, как вы можете видеть здесь .

Я не знаю, могут ли эти пошаговые декораторы быть решением, потому что я не совсем понимаю, каккак они работают и как я могу их настроить.

Как вы думаете, что является самым простым решением в этом вопросе?Как бы вы решили это, если бы вы были на моем месте?

Ответы [ 2 ]

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

Приемочные тесты не могут выполнять какой-либо серверный код, поэтому функции wordpress недоступны, вы можете использовать только вспомогательные методы, предоставляемые модулем WpWebDriver, для взаимодействия с веб-сайтом.

Поскольку see методыгенерировать исключения, когда они не могут увидеть ожидаемое, вы можете перехватить это исключение и выполнить другой код, только если утверждение не выполнено.

public function _before(AcceptanceTester $I)
{
    $I->loginAsAdmin();
    $I->amOnPluginsPage();
    try {
        //it throws PHPUnit Assertion Failed exception if plugin is active.
        $I->seePluginDeactivated('my-plugin');
    } catch (\Exception $e) {
        $I->deactivatePlugin('hello-dolly');
    }
}

Если вы хотите повторно использовать этот код во многих тестовых файлах, сделайте еговспомогательный метод, описанный в https://codeception.com/docs/06-ModulesAndHelpers#Helpers

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

Прежде всего, эта функциональность добавляется в ядро, поэтому я бы не стал беспокоиться об этом.Это настоящая боль в шее.Если вы должны протестировать что-то подобное, вы должны смотреть в среду.Вы можете установить одну «среду» с более низкой версией PHP.
https://core.trac.wordpress.org/ticket/40934

Моя стратегия состоит в том, чтобы считать «приемочные» тесты утилитой верхнего уровня.Вы должны перенести этот вид теста на CLI или модульные тесты.Я использую приемочные тесты в WordPress для сохранения «состояния».Вы говорите, что ваши тесты мешают друг другу, поэтому вы этого не хотите.

...