So testen Sie eine Methode, die von einem Aktions-Hook aufgerufen wird
1 Antworten
- Stimmen
-
- 2014-09-08
Lassen Siemich zunächst sagen,dass die Aktion
init
aufgerufen wird,wenn WordPressgeladen wird,bevor die Tests ausgeführt werden. Wenn Sie also Ihr Plugin/Thememit WordPressgeladen haben (z. B. durch Einbindeninmuplugins_loaded
),sollte die Methoderegister_my_type()
aufgerufen werden,wenn Ihr Konstruktor diesist wird vorinit
aufgerufen. (Wenn Sie Ihr Pluginnicht auf diese Weise laden,lesen Sie dieses Tutorial .)In Ihren Unit-Tests sollten Sie alsoin der Lage sein,Folgendes zutun:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
Sie können auch
get_post_type()
verwenden,um zu überprüfen,ob der Beitragstypmit den richtigen Argumenten registriert wurde. (Diesist dasgleiche,wasichmache,um zu überprüfen,obmeine Shortcodes registriert sind.)Ich würdemir keine Sorgenmachen,wennich versuchen würde zutesten,ob die Methode aufgerufen wurde,obwohl Sie die Liste der Aktionenin
$wp_actions
überprüfen können,umfestzustellen,ob sie ordnungsgemäß angeschlossen wurde. Sie könnten aucheine Klasseneigenschaft als Flag setzen,wenn sie aufgerufen wird,aberich denke wirklich,dass das alles übertriebenist. Wennes um Dinge wieinit
geht,insbesondere umeine Funktion wie diese,dienureinmal ausgeführt werdenmuss,sind Funktionstests diebeste Wahl. Überprüfen Sie,ob sie dasgetan haben,was sietun sollen,anstatt sich darauf zu konzentrieren,eine einzelne Einheit zutesten,z. B. ob die Methode aufgerufen wurde.Sie könnenjedoch auchtesten,ob die Methode den Beitragstyp registriert,indem Sie den Beitragstyp abmelden und die Methodemanuell aufrufen. WordPress scheint keine
deregister_post_type()
-Funktionbereitzustellen,sodass Sie sich direktmit dem$wp_post_types
global herumschlagenmüssen. Sie können Ihren Beitragstyp daraus löschen und dann Ihre Methode aufrufen undprüfen,ob sieerneut registriertist.Let me start by saying that the
init
action is called when WordPress is loaded, before the tests are run. So it you are having your plugin/theme loaded with WordPress (by hooking intomuplugins_loaded
, for example), theregister_my_type()
method should be getting called, if your constructor is being called beforeinit
. (If you aren't loading your plugin that way, have a look at this tutorial.)So in your unit tests you should be able to do this:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
You could also use
get_post_type()
to check that the post type was registered with the correct arguments. (This is the same sort of thing I do to check that my shortcodes are registered.)I wouldn't worry about trying to test that the method was called, although you could check the list of actions in
$wp_actions
to see if it was hooked up properly. You could also set a class property as a flag when it is called, but I really think all of that's overkill. When it comes to things hooked to actions likeinit
, especially a function like this which only needs to run once, functional tests are your best bet. Check that they've done what they're supposed to do, rather than focusing on trying to test a single unit like whether the method was called.That said, you could also test that the method registers the post type by deregistering the post type and manually calling the method. WordPress doesn't appear to provide a
deregister_post_type()
function, so you'd have to mess with the$wp_post_types
global directly. You could delete your post type from that and then call your method and check if it is registered again.-
Vielen Dank!Ich konntebestätigen,dass die Aktion "init" aufgerufen wird.Ich habeimmernoch Problememit der Initialisierung des Pluginsin einem Test,in demich dem Konstruktor Argumente liefernmuss. Dieses Tutorialist sehr hilfreich.Mir war vorhernicht klar,dass die Testseine völlig separate Umgebung laden.Thanks! I've been able to confirm that the `init` action is being called. I'm still having problems with initializing the plugin in a test where I need to supply arguments to the constructor. That tutorial is very helpful. It wasn't clear to me before that the tests are loading a completely separate environment.
- 0
- 2014-09-08
- Simon Cossar
-
Ichbin froh,dassesgeholfen hat.Abhängig davon,wie Ihr Pluginfunktioniert,können Sieesmöglicherweiseeinfachneuinitialisieren,indem Sie den Konstruktor aufrufen.Wenn diesfür Sienicht wirklichfunktioniert,müssen Sie diese Testsmöglicherweise separat undmit zusätzlichem Code ausführen,um siemit den richtigen Argumenten zuinitialisieren.Sie können Ihre Tests kategorisieren,indem Sie die Annotation "@groupmy_group_name"in den Dokumentblöcken der Testfallklasse hinzufügen.Sie können danneine Gruppein Ihrer Konfiguration ausschließen und separatmit "phpunit --groupmy_group" ausführen.Dannmüssen Sieerkennen,wann diese Gruppe ausgeführt wird,und das Plugin andersinitialisieren.I'm glad it helped. Depending on how your plugin works, you may be able to just reinitialize it by calling the constructor. If that won't really work for you, you may have to run those tests separately and with some extra code to initialize it with the correct arguments. You can categorize your tests by adding the `@group my_group_name` annotation in the testcase class docblocks. You can then exclude a group in your config, and run it separately with `phpunit --group my_group`. Then you'll need to detect when that group is being run and initialize the plugin differently.
- 0
- 2014-09-08
- J.D.
-
Ein Beispiel dafür,wie Siefeststellen können,welche Gruppe ausgeführt wird,finden Sie unter [diesen Codein WordPress 'Bootstrap] (https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/bootstrap.php)rev=28910 # L108).For an example of how to detect what group is being run you can look at [this code in WordPress' bootstrap](https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/bootstrap.php?rev=28910#L108).
- 0
- 2014-09-08
- J.D.
Der Konstruktorin meiner Klassefügt dem Aktionshaken 'init'eine Aktion hinzu:
Ich habe versucht,diesin einem Komponententest zutesten,und schließlichfestgestellt,dasses keinen Grundgab,den Aktionshaken 'init' auszulösen. Gibteseine Möglichkeit zutesten,ob die Methode register_my_type aufgerufen wird und obein neuer Beitragstyp registriert wird?
Bearbeiten:
Die Hauptursachefürmeine Verwirrung war,dassich die Beziehung zwischenphpunit,der WordPress-Testsuite,meinem Klassencode undmeinem Testcodenicht verstanden habe.
Wasichjetzt verstehe,ist,dassmit den WordPress-Entwicklertools,die soinstalliert sind,wiees von dieses Tutorial oder über WP-CLI ,a callto
phpunit
lädteine Bootstrap-Datei,die das Plugin dannin den Aktionshakenmuplugins_loaded
einbindet. Die Bootstrap-Datei lädt dann die WordPress-Testumgebung. Nachdem WordPress das Ladenbeendet hat,wird derinit
-Hook ausgeführt. Plugin-Code,derinit
verwendet,sollte wieerwartetfunktionieren.Tests sindmeistnurnormaler Code,der verfügbare Funktionen oder Klassen verwendet. Das Besondere anihnenist,dass sie als Methodeneiner Klassegeschrieben sind,die
WP_UnitTestCase
erweitert undPHPUnit_Framework_TestCase
erweitert. Wenn diese Testsin diese Klasseeingeschlossen werden,erhalten sie Zugriff auf Zusicherungen und Objektfabriken undführen die MethodensetUp
undtearDown
aus,sodassjeder Test unabhängig von den anderenist.