WP_Ajax_UnitTestCase löst keine WPAjaxDieStopException aus

Lesezeit: 4 Minuten

Benutzeravatar von Jplus2
Jplus2

Ok, also teste ich meine Ajax-Callbacks für mein WordPress-Plugin. Also habe ich im Grunde die Anweisungen hier befolgt
https://codesymphony.co/wp-ajax-plugin-unit-testing/

Hier ist meine Ajax-Callback-Funktion

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();

}

Hier ist mein Test

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 );

  }

}

Hier sind nun die Probleme

  1. Es löst keine WPAjaxDieStopException-Ausnahme aus, wie es angenommen wird

wenn ich diesen Code mache $this->setExpectedException( 'WPAjaxDieStopException' );
es besteht den Test nicht https://snag.gy/JSTqHV.jpg

  1. Es gibt aus, dass wp_die() ausgelöst wurde, also dieser Code

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

druckt diese

https://snag.gy/pKqfUk.jpg

Nummer 2 ist ein Problem, weil Sie es nicht tun können json_decode Die ausgegebene Zeichenfolge ist eine ungültige JSON-Zeichenfolge, sodass ich mit meinem Test nicht fortfahren kann.

Ich fange gerade erst mit dem automatisierten Testen von WordPress-Plugins an und bin für jede Hilfe dankbar.

Hinweis: Mein Ajax-Callback funktioniert gut auf meinem Live-Plugin, selbst wenn ich wp_die() verwende, gibt es bei meinem Test nur diesen seltsamen ‘wp_die called …’-String aus.

Meine PHP-Version ist 5.6.21 und meine PHPunit-Version ist 4.8.26


Hier sind einige zusätzliche Informationen

Also werden sowohl ‘WPAjaxDieStopException’ als auch ‘WPAjaxDieContinueException’ nicht ausgelöst,

Was jedoch interessant ist, ist, wenn ich dies tue

$this->_setRole( 'administrator' );

Ich bekomme diesen Fehler auf der Konsole

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

Aber offensichtlich erweitere ich WP_Ajax_UnitTestCase und es hat die _setRole-Methode
https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/testcase-ajax.php#L168

Auch wenn ich phpunit starte, erhalte ich diese Reihe von Fehlern oder Warnungen auf der Konsole

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

Außerdem verwende ich Vagrant und use http://vccw.cc/ für meine Entwicklungsumgebung und befolgen Sie auch diese Anleitung zum Hinzufügen von Tests für Woocommerce-Erweiterungen
https://github.com/Automattic/wc-extensions-code-test-guide

Ich hoffe, dass all diese zusätzlichen Informationen dazu beitragen, dieses Problem endgültig zu lösen.

  • Haben Sie versucht, $this->assertEquals(..) hinzuzufügen; oder $this->assertTrue( isset( $e ) ); unmittelbar nach dem try-catch ? weil Sie möglicherweise eine Ausgabe erhalten, die das Handbuch sagt.

    – Ooogi

    14. Juni 2016 um 8:58 Uhr


  • ich habe keine ahnung von dem ding 🙁

    – skzac

    14. Juni 2016 um 10:23 Uhr

  • @Oooogi nah kein Glück, $this->assertTrue( isset( $e ) ); den Test nicht besteht, werden überhaupt keine Ausnahmen ausgelöst.

    – Jplus2

    14. Juni 2016 um 11:20 Uhr

  • Können Sie versuchen Folgendes zu setzen: add_action( ‘wp_ajax_my_plugin_get_site_pages’ , array( $this , ‘my_plugin_get_site_pages’ ) ); anstelle dessen, was Sie geschrieben und überprüft haben?

    – Ooogi

    14. Juni 2016 um 11:52 Uhr


  • @Oooogi ja schon gemacht, kein Glück.

    – Jplus2

    14. Juni 2016 um 12:18 Uhr

War eine Weile weg, war sehr beschäftigt, hatte endlich etwas Zeit, um das herauszufinden. Es stellt sich heraus, dass es ein dummer Fehler ist (facepalm).

Da wir WP_Ajax_UnitTestCase verwenden, das WP_UnitTestCase erweitert

Wenn wir dann die Funktion setup in WP_Ajax_UnitTestCase verwenden, müssen wir dies aufrufen parent::setup();

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

Ich habe das nicht in meinem vorhandenen Code aufgerufen, deshalb verhält sich der Test seltsam. Das Hinzufügen löst alle seltsamen Probleme und führt den Test wie erwartet aus und löst die erforderlichen Ausnahmen aus.

WPAjaxDieStopException wird ausgelöst, wenn die Ajax-Callback-Funktion keine Ausgabe liefert.

WPAjaxDieContinueException wird ausgelöst, wenn der Ajax-Callback eine Ausgabe liefert.

Auch unbedingt verwenden wp_die() Anstatt von die() Bei Ihrem Ajax-Callback wird der Test angehalten, wenn Sie das spätere verwenden.

Ich plane, einen ausführlichen Leitfaden für automatisierte Tests in WordPress-Plugins zu schreiben, ich werde den Link dazu bald hier einfügen.

Im Moment hoffe ich, dass dies jemandem hilft.

1401170cookie-checkWP_Ajax_UnitTestCase löst keine WPAjaxDieStopException aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy