问题描述

我正在为我的插件设置单元测试。在我的测试/phpunit /bootstrap.php 文件中我有:

require_once $wp_tests_dir . '/includes/functions.php';

    tests_add_filter( 'muplugins_loaded', function() {
        require /can/this/be/anywhere/on/my/filesystem/myplugin/myplugin.php
    } );

// Start up the WP testing environment
require_once $wp_tests_dir . '/includes/bootstrap.php';

正如你可以看到,我要求我的插件的主要文件内部的一个函数挂钩到 muplugins_loaded 开始 WP 测试环境之前。

我的问题

myplugin /myplugin.php 是否需要位于 WordPress 测试安装的 wp-content /plugins 目录中,或者可以位于我的文件系统的任何位置?

最佳解决方案

长文慎入

它可以是文件系统的任何地方。

(但请参阅下面的更新工具,这将有助于您更真实地进行此操作。)

Explanation

该插件可以是文件系统上的任何位置,具体取决于您的插件是否具有安装功能以及如何运行该插件。

如果您的插件创建数据库表或在激活时保存数据库中的默认选项,那么只需加载您的插件将不会导致您的插件安装,因此您的插件可能无法正常工作。所以除了加载插件,你还需要安装它。

WordPress 这样做的方法是使用 activate_plugin()功能,它将调用插件的 register_activation_hook()注册的激活钩子。

但是,activate_plugin()验证插件是否存在于 wp-content/plugins 文件夹中,因此如果您安装插件,那么您必须在 plugins 目录中实际拥有插件 (或其符号链接) 。

这是一个痛苦,所以我通常不用 activate_plugin()安装插件。而是直接调用您在 register_activation_hook()中注册的任何功能。这可能不是很理想,但我没有经历过任何意外的 side-effects 。

所以你会有这样的东西:

tests_add_filter( 'muplugins_loaded', function() {
    require '/path/to/plugin/anywhere/on/filesystem/myplugin/myplugin.php'

    my_plugin_install_function();
} );

当然,如果你的插件没有安装功能,这一点是愚蠢的,你可能根本不必担心激活/安装插件。只需从文件系统的任何地方加载它,并且您的测试应该正常工作。

WebDriver 测试

请注意,可能 (可能应该) 会出现一段时间,当您要为插件运行验收测试。根据您如何决定,您需要在 WebDriver 浏览器访问的站点上实际启用插件。

WP Browser 通过 Codeception 为 PHPUnit 提供了几个选项。除了客户端/远程端之外,它目前提供的任何选项都不会在测试端加载插件,因此在 WebDriver 测试中使用的站点与单元测试中使用的站点完全分离。 (但是,我目前是 working on a hybrid approach,它在运行 WebDriver 测试时使用相同的站点并在测试方面加载。)

更新 2016 年 11 月

尽管上面所说的一切都是真实的,并且以这种方式加载插件没有引起任何问题,但是我最近决定在单元测试中如何加载和安装插件来追求更大的现实感。为此,我创建了一个名为 WPPPB 或 WordPress 插件 PHPUnit Bootstrap 的小库。使用它时,加载您的插件就像这样简单:

$loader = WPPPB_Loader::instance();
$loader->add_plugin( 'my-plugin/my-plugin.php' );
$loader->load_wordpress();

这是非常简单的,因为在 WordPress 加载之前,插件被远程激活,因此它可以被 WordPress 完全按照通常 「现实生活中」 加载。这需要你在插件文件夹中插入一个符号链接,但库包含一个脚本,可以自动设置所有内容。 (专业提示:WPPPB 还包括帮助您非常现实地测试插件卸载/安装的工具。)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。