Frage

Der Konstruktor in meiner Klasse fügt dem Aktions-Hook „init“ eine Aktion hinzu:

class My_Custom_Post_Type {

    function __construct( $type ) {
        $this->type = $type;
        add_action( 'init', array( $this, 'register_my_type' );
    }

    function register_my_type() {
        register_post_type( $this->type);
    } 
}    

Ich habe versucht, dies in einem Unit-Test zu testen und habe schließlich festgestellt, dass es keinen Grund für das Auslösen des Aktions-Hooks „init“ gab.Gibt es eine Möglichkeit zu testen, ob die Methode register_my_type aufgerufen wird und ob ein neuer Beitragstyp registriert wird?

Bearbeiten:

Der Hauptgrund für meine Verwirrung lag darin, dass ich die Beziehung zwischen phpunit, der WordPress-Testsuite, meinem Klassencode und meinem Testcode nicht verstand.

Was ich jetzt verstehe, ist, dass die WordPress-Entwicklertools auf die von vorgeschlagene Weise installiert sind dieses Tutorial oder durch WP-CLI, ein Anruf an phpunit lädt eine Bootstrap-Datei, die dann das Plugin in das einbindet muplugins_loaded Aktionshaken.Die Bootstrap-Datei lädt dann die WordPress-Testumgebung.Nachdem WordPress das Laden abgeschlossen hat init Haken wird ausgeführt.Plugin-Code, der verwendet init sollte wie erwartet funktionieren.

Bei Tests handelt es sich meist nur um normalen Code, der verfügbare Funktionen oder Klassen nutzt.Der Unterschied besteht darin, dass sie als Methoden einer erweiterten Klasse geschrieben sind WP_UnitTestCase was sich erstreckt PHPUnit_Framework_TestCase.Durch die Einbindung in diese Klasse erhalten die Tests Zugriff auf Behauptungen und Objektfabriken und können ausgeführt werden setUp Und tearDown Methoden, sodass jeder Test unabhängig von den anderen ist.

War es hilfreich?

Lösung

Lassen Sie mich zunächst sagen, dass die init Aktion Ist Wird aufgerufen, wenn WordPress geladen wird, bevor die Tests ausgeführt werden.Wenn Sie also Ihr Plugin/Theme mit WordPress laden (indem Sie es einbinden). muplugins_loaded, zum Beispiel), die register_my_type() Die Methode sollte aufgerufen werden, wenn Ihr Konstruktor zuvor aufgerufen wurde init.(Wenn Sie Ihr Plugin nicht auf diese Weise laden, schauen Sie sich Folgendes an dieses Tutorial.)

In Ihren Unit-Tests sollten Sie also in der Lage sein, Folgendes zu tun:

$this->assertTrue( post_type_exists( 'my_post_type' ) );

Sie könnten auch verwenden get_post_type() um zu überprüfen, ob der Beitragstyp mit den richtigen Argumenten registriert wurde.(Das ist das Gleiche, was ich mache, um zu überprüfen, ob meine Shortcodes registriert sind.)

Ich würde mir keine Sorgen machen, zu testen, ob die Methode aufgerufen wurde, obwohl Sie die Liste der Aktionen überprüfen könnten $wp_actions um zu sehen, ob es richtig angeschlossen ist.Sie könnten auch eine Klasseneigenschaft als Flag festlegen, wenn sie aufgerufen wird, aber ich halte das alles wirklich für übertrieben.Wenn es um Dinge geht, die mit Aktionen wie verbunden sind init, insbesondere für eine Funktion wie diese, die nur einmal ausgeführt werden muss, sind Funktionstests die beste Wahl.Überprüfen Sie, ob sie getan haben, was sie tun sollen, anstatt sich darauf zu konzentrieren, eine einzelne Einheit zu testen, beispielsweise ob die Methode aufgerufen wurde.

Allerdings können Sie auch testen, ob die Methode den Beitragstyp registriert, indem Sie die Registrierung des Beitragstyps aufheben und die Methode manuell aufrufen.WordPress scheint keine bereitzustellen deregister_post_type() Funktion, also müsste man sich mit der herumschlagen $wp_post_types global direkt.Sie könnten Ihren Beitragstyp daraus löschen und dann Ihre Methode aufrufen und prüfen, ob sie erneut registriert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top