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