好的,所以我正在测试我的WordPress插件的ajax回调函数。 因此,我基本上遵循了这里的说明 https://codesymphony.co/wp-ajax-plugin-unit-testing/
这是我的ajax回调函数。
public function my_plugin_get_site_pages( $args = null ) {
//...... Processing $site_pages.....
$response = array(
'status' => 'success',
'site_pages' => $site_pages
);
@header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
echo wp_json_encode( $response );
wp_die();
}
这是我的测试
class My_Plugin_Ajax_Test extends WP_Ajax_UnitTestCase {
private $_foo;
public function setup() {
//.....Initialize $_foo here...
}
public function test_foo() {
try {
$_POST[ 'args' ] = array( 'return_format' => 'raw' );
add_action( 'wp_ajax_my_plugin_get_site_pages' , array( $this->_foo , 'my_plugin_get_site_pages' ) );
//$this->setExpectedException( 'WPAjaxDieStopException' );
$this->_handleAjax( 'my_plugin_get_site_pages' );
} catch ( WPAjaxDieStopException $e ) {}
//$response = json_decode( $this->_last_response );
$response = $this->_last_response;
var_dump( $response );
}
}
现在存在的问题是:
- 它没有像应该一样抛出WPAjaxDieStopException异常。
当我运行以下代码 $this->setExpectedException( 'WPAjaxDieStopException' );
时,测试失败,详情请见https://snag.gy/JSTqHV.jpg
- 它打印出已触发wp_die(),所以这段代码
$response = $this->_last_response;
var_dump( $response );
输出如下:
问题二是因为你无法对输出的字符串进行json_decode,因为它是无效的json字符串,所以我无法继续我的测试。
我刚开始使用wordpress插件自动化测试,感激任何帮助。
注:即使我使用wp_die(),我的ajax回调在我的实际插件上也可以正常工作,只是在测试中会打印出奇怪的“wp_die called ...”字符串。
我的php版本是5.6.21,phpunit版本是4.8.26。
以下是一些额外信息:
'WPAjaxDieStopException'和'WPAjaxDieContinueException'都没有被抛出,
然而有趣的是当我运行以下代码时:
$this->_setRole( 'administrator' );
我在控制台上看到了这个错误。
Trying to get property of non-object
/tmp/wordpress-tests-lib/includes/testcase-ajax.php:151
/vagrant/www/wordpress/wp-content/plugins/my-plugin/tests/test-file.php:30
但显然我正在扩展 WP_Ajax_UnitTestCase 并且它有 _setRole 方法 https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/testcase-ajax.php#L168
当我运行phpunit时,控制台会输出一堆错误或警告信息
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
WordPress database error Duplicate key name 'location_type_code' for query ALTER TABLE wptests_woocommerce_tax_rate_locations ADD KEY location_type_code (location_type(40),location_code(90)) made by PHPUnit_TextUI_Command::main, PHPUnit_TextUI_Command->run, PHPUnit_TextUI_Command->handleArguments, PHPUnit_TextUI_Command->handleBootstrap, PHPUnit_Util_Fileloader::checkAndLoad, PHPUnit_Util_Fileloader::load, include_once('/vagrant/www/wordpress/wp-content/plugins/my-plugin/tests/bootstrap.php'), require('/tmp/wordpress-tests-lib/includes/bootstrap.php'), require_once('wp-settings.php'), do_action('init'), call_user_func_array, WC_Install::check_version, WC_Install::install, WC_Install::create_tables, dbDelta
另外,我正在使用Vagrant,并在我的开发环境中使用http://vccw.cc/,并遵循此指南添加用于Woocommerce扩展的测试:https://github.com/Automattic/wc-extensions-code-test-guide
希望所有这些额外信息能够帮助最终解决此问题。