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
- 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
- Es gibt aus, dass wp_die() ausgelöst wurde, also dieser Code
$response = $this->_last_response;
var_dump( $response );
druckt diese
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