問題描述

我正在為我的插件設置單元測試。在我的測試/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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。