有没有办法在不使用die()的情况下发出admin-ajax请求?

时间:2017-04-18 作者:rich

和标题差不多。

我编写了一个自定义插件,它依赖于管理ajax来处理各种表单和操作。这一切都很好,但是由于各种函数都会产生响应,我必须在echo函数之后插入一个die()。ie:

echo $return_string;
die();
很好,但不幸的是,这破坏了我的PHPUnit测试,因为抛出一个die()将杀死脚本并阻止单元测试工作。如果没有骰子,我会在响应结束时收到传统的0,这不是我想要的。还尝试了推荐的WP:

wp_die();
有人对如何绕过这一点有什么想法吗?

2 个回复
SO网友:J.D.

如果您使用wp_die() 您可以使用WordPress的PHPUnit测试套件中包含的工具。这个WP_Ajax_UnitTestCase 提供_handleAjax() 方法,该方法将钩住wp_die() 并引发异常,这将阻止die() 避免被呼叫。我写了一个tutorial on how to use WP_Ajax_UnitTestCase, 这解释了它提供的所有功能,但下面是一个基本示例:

class My_Ajax_Test extends WP_Ajax_UnitTestCase {

    public function test_some_option_is_saved() {

        // Fulfill requirements of the callback here...
        $_POST[\'_wpnonce\'] = wp_create_nonce( \'my_nonce\' );
        $_POST[\'option_value\'] = \'yes\';

        try {
            $this->_handleAjax( \'my_ajax_action\' );
        } catch ( WPAjaxDieStopException $e ) {
            // We expected this, do nothing.
        }

        // Check that the exception was thrown.
        $this->assertTrue( isset( $e ) );

        // Check that the callback did whatever it is expected to do...
        $this->assertEquals( \'yes\', get_option( \'some_option\' ) );
    }
}
请注意,从技术上讲,这是集成测试而不是单元测试,因为它测试回调功能的完整横截面,而不仅仅是单个单元。WordPress就是这样做的,但根据回调代码的复杂性,您可能还想为其创建真正的单元测试,可能会将其中的部分抽象为其他可以模拟的函数。

SO网友:Mark Kaplun

不幸的是,ajax挂钩处理程序必须die 否则wordpress将继续运行,可能会生成更多输出(也可能不会,但您不想依赖它)。

解决方案可能是在函数中隔离响应生成代码并测试它生成的输出,然后在钩子处理程序本身上执行

echo echo_fn(....);
wp_die()
那么在单元测试中,您只需测试echo_fn().

相关推荐

WordPress AJAX错误400向远程站点发送数据的错误请求

我正在使用发件人。net获取电子邮件订阅列表。这个网站给了我一些信息,可以将用户的电子邮件添加到订阅列表中。我想使用WordPress ajax来实现这一点。但它返回错误400错误请求。我的代码是:文件ajax新闻脚本。js公司: jQuery(document).ready(function($){ // Perform AJAX send news on form submit $(\'form#fnews\').on(\'submit\', funct