在对插件进行单元测试时,插件是否需要位于WordPress测试安装的wp-content/plugins目录中?

时间:2016-02-18 作者:henrywright

我目前正在为我的插件设置单元测试。在我的测试/phpunit/引导中。我拥有的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测试环境之前。

My question

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

1 个回复
最合适的回答,由SO网友:J.D. 整理而成

TL;DR可以位于文件系统的任何位置。

(但请参阅下面的更新,以获得一个可以帮助您更真实地完成此操作的工具。)

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

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

WordPress这样做的方式是使用activate_plugin() 函数,该函数将调用在中注册的插件的激活挂钩register_activation_hook().

然而activate_plugin() 验证插件是否存在于wp-content/plugins 文件夹,因此如果您以这种方式安装插件,那么您必须在插件目录中实际拥有您的插件(或指向它的符号链接)。

这是一种疼痛,所以我通常不使用activate_plugin() 安装插件。相反,我调用您注册的任何函数register_activation_hook() 直接地这可能并不理想,但我没有经历过任何意外的副作用。

所以你会有这样的东西:

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引导。使用它时,加载插件非常简单:

$loader = WPPPB_Loader::instance();
$loader->add_plugin( \'my-plugin/my-plugin.php\' );
$loader->load_wordpress();
这看起来很简单,因为在加载WordPress之前,插件在幕后被远程激活,这样WordPress就可以像“在现实生活中”一样加载插件。这确实需要在plugins文件夹中有一个指向插件的符号链接,但库中包含一个脚本,可以自动为您设置所有内容。(专业提示:WPPPB还包括一些工具,可以帮助您非常真实地测试插件的卸载和安装。)