如何检查 Wordpress 插件是否在 Codeception 验收测试中激活

How to check a Wordpress plugin is activated in a Codeception acceptance test

我正在学习如何在 Wordpress 中编写插件,我想测试插件在激活时的行为。我正在使用 Codeception/Wp-Browser 作为 TDD 框架。我打算使用模块 WpWebDriver 和 Chrome.

编写一个 验收测试

问题是我写的测试互相干扰。因此,我需要在每次测试前重置插件的状态,但我不知道该怎么做。

在每次测试之前我需要:

我知道我可以在 Cest class 中使用 _before 方法。这是我的代码:

<?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 的文档说有conditional assertions --that is, methods like canSeeElement or cantSeeElement, used to test that an element is on the page and will not stop the test if they fail. It seems there is something similar for Codeception actions, as you can see here

我不知道这些步骤装饰器是否可以作为解决方案,因为我不清楚它们是如何工作的以及如何设置它们。

你认为解决这个问题最简单的方法是什么?如果你处在我的位置,你会如何解决?

验收测试无法执行任何服务器端代码,因此您无法使用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

中所述