it-swarm-ja.com

Die()を使用せずにadmin-ajaxリクエストを行う方法はありますか?

タイトルが言っていることのほとんど。

私はカスタムプラグインを書いています。それはさまざまなフォームやアクションを処理するためにadmin-ajaxの使用に依存しています。しかし、さまざまな関数が応答をエコーアウトするので、echo関数の後にdie()を使用する必要があります。すなわち:

echo $return_string;
die();

すべて問題ありませんが、残念ながら私のPHPUnitテストではdie()をスローするとスクリプトが強制終了され、単体テストが機能しなくなるため、テストが中断されます。死ぬことなしに私は私の応答の終わりに伝統的な0を受け取る、これは私が望むものではありません。 WPも試してみました:

wp_die();

誰もがこれを回避する方法について何かアイデアがありますか?

2
rich

wp_die()を使えば、WordPressのPHPUnitテストスイートに含まれているツールを利用できます。 WP_Ajax_UnitTestCaseは、_handleAjax()によって呼び出されるアクションにフックして例外をスローするwp_die()メソッドを提供します。これはdie()が呼び出されるのを防ぎます。 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のやり方ですが、あなたのコールバックのコードの複雑さによっては、あなたはそれのために真の単体テストを作成したくなるかもしれません。

6
J.D.

残念なことに、ajaxフックハンドラはdieでなければなりません。そうでなければwordpressは実行を続け、さらにいくつかの出力が生成されるかもしれません(あるいはそうでないかもしれませんが、それに頼りたくないでしょう)。

解決策は、おそらくレスポンス生成コードを関数内で分離し、生成された出力をテストしてからフックハンドラ自体で実行することです。

echo echo_fn(....);
wp_die()

それからあなたのユニットテストであなたはecho_fn()だけをテストします。

3
Mark Kaplun