我正在为插件编写集成测试,我使用wp-cli
和scaffolding测试完成了所有操作。当我运行phpunit
时,它们运行正常。但我遇到的问题是我使用composer
和npm
- composer来获得一些额外的功能,npm
用于捆绑我的脚本。
脚本部分非常重要,因为我要从public
文件夹(构建文件夹)中排队脚本
$main_script = 'public/scripts/application.js';
wp_register_script( 'plugin-scripts', plugin_dir_url( __DIR__ ) . $main_script, array() );
wp_enqueue_script( 'plugin-scripts' );
我需要测试我的脚本和样式是否排队,所以我添加了一个测试
public function test_enqueued_scripts() {
$this->admin->enqueue_styles();
$this->assertTrue( wp_script_is( 'plugin-scripts' ) );
}
$this->admin
只是我的enqueue方法在setUp()
方法中的类的一个实例。
我收到错误,因为它说Failed asserting that false is true.
构建了我正在测试的插件并安装了composer。当我在我的WordPress实例本地时,所有文件夹都存在并且一切正常。但是测试实例与我的本地实例(ofc)不同。我在enqueue方法中error_log
编辑了file_exist
并且我得到了false
。
我需要用phpunit来测试它(客户要求是要有完整的测试覆盖率)。
我的bootstrap.php
看起来像这样
<?php
/**
* PHPUnit bootstrap file
*
* @package Plugin
*/
$_tests_dir = getenv( 'WP_TESTS_DIR' );
if ( ! $_tests_dir ) {
$_tests_dir = rtrim( sys_get_temp_dir(), '/\\' ) . '/wordpress-tests-lib';
}
if ( ! file_exists( $_tests_dir . '/includes/functions.php' ) ) {
echo "Could not find $_tests_dir/includes/functions.php, have you run bin/install-wp-tests.sh ?" . PHP_EOL;
exit( 1 );
}
// Give access to tests_add_filter() function.
require_once $_tests_dir . '/includes/functions.php';
/**
* Manually load the plugin being tested.
*/
function _manually_load_plugin() {
// Update array with plugins to include ...
$plugins_to_active = array(
'advanced-custom-fields-pro/acf.php',
'my-plugin/my-plugin.php',
);
update_option( 'active_plugins', $plugins_to_active );
require dirname( dirname( dirname( __FILE__ ) ) ) . '/advanced-custom-fields-pro/acf.php';
require dirname( dirname( __FILE__ ) ) . '/my-plugin.php';
}
tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );
// Start up the WP testing environment.
require $_tests_dir . '/includes/bootstrap.php';
如何在单元测试之前启动构建过程(npm run build
)以便我的脚本存在?也可以让这个构建步骤只运行一次,而不是每次运行phpunit
?
答案 0 :(得分:2)
一个非常基本的解决方案是检查npm在引导程序中使用file_exists()
创建的文件。
如果不存在,请使用shell_exec()
答案 1 :(得分:1)
在执行断言之前,您需要运行do_action('wp_enqueue_scripts')
。 This article包含更多详细信息和示例。因此,您的测试应如下所示:
public function test_enqueued_scripts() {
$this->admin->enqueue_styles();
do_action('wp_enqueue_scripts');
$this->assertTrue( wp_script_is( 'plugin-scripts' ) );
}
我已经测试了此解决方案,并且可以正常工作。