WP_Ajax_UnitTestCase不会抛出WPAjaxDieStopException异常。

15

好的,所以我正在测试我的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 );

  }

}

现在存在的问题是:

  1. 它没有像应该一样抛出WPAjaxDieStopException异常。

当我运行以下代码 $this->setExpectedException( 'WPAjaxDieStopException' ); 时,测试失败,详情请见https://snag.gy/JSTqHV.jpg

  1. 它打印出已触发wp_die(),所以这段代码

$response = $this->_last_response; var_dump( $response );

输出如下:

https://snag.gy/pKqfUk.jpg

问题二是因为你无法对输出的字符串进行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

希望所有这些额外信息能够帮助最终解决此问题。


你尝试过在try-catch之后立即添加$this->assertEquals(..);或$this->assertTrue( isset( $e ) );吗?因为你可能会收到一些输出,手册上说。 - Oooogi
我对这个东西一无所知 :( - skzac
@Oooogi 嗯,没有运气,$this->assertTrue( isset( $e ) ); 失败了测试,根本没有抛出任何异常。 - Jplus2
你能试着输入以下代码并检查一下吗? add_action( 'wp_ajax_my_plugin_get_site_pages' , array( $this , 'my_plugin_get_site_pages' ) ); - Oooogi
@Oooogi,你在你的端口复制了我的问题吗?你以前写过带有自动化测试和Ajax测试的WooCommerce扩展吗?如果是,请分享你的代码。另外,我该如何重新开放这个问题以再次获得悬赏?我会将悬赏增加到100,感谢你的帮助。干杯。 - Jplus2
显示剩余2条评论
1个回答

4

我有一段时间没在,非常忙,最终抽出时间来解决这个问题。结果发现这是一个愚蠢的错误(捂脸)。

由于我们正在使用WP_Ajax_UnitTestCase扩展WP_UnitTestCase

所以当我们在WP_Ajax_UnitTestCase中使用设置函数时,我们需要调用这个parent::setup();

public function setup() {
    parent::setup();
    // your init codes here
}

之前在我的现有代码中没有调用它,这就是为什么测试表现奇怪的原因。添加它可以解决所有奇怪的问题,并按预期运行测试并抛出必要的异常。

如果ajax回调函数没有产生任何输出,将会抛出WPAjaxDieStopException异常。

如果ajax回调函数产生了任何输出,则会抛出WPAjaxDieContinueException异常。

另外,请确保在您的ajax回调中使用wp_die()而不是die(),如果使用后者,测试将停止。

我计划编写一份详尽的指南,介绍在WordPress插件中进行自动化测试的方法,我很快会在这里提供链接。

现在希望这能帮到大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接