Come testare correttamente un metodo chiamato da un action hook
1 risposta
- voti
-
- 2014-09-08
Vorreiiniziare dicendo che l'azione
init
viene chiamata quando WordPress viene caricato,prima chei test venganoeseguiti. Quindi se stai caricandoiltuoplugin/tema con WordPress (collegandoti amuplugins_loaded
,peresempio),ilmetodoregister_my_type()
dovrebbeessere chiamato,seiltuo costruttoreessere chiamatoprima diinit
. (Senon stai caricandoiltuopluginin questomodo,dai un'occhiata a questotutorial .)Quindinei tuoi unittest dovrestiesserein grado difarlo:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
Puoi anche usare
get_post_type()
per verificare cheiltipo dipost sia stato registrato congli argomenti corretti. (Questo è lo stessogenere di operazioni chefaccioper verificare chei miei codicibrevi siano registrati.)Nonmi preoccuperei diprovare aprovare cheilmetodo è stato chiamato,sebbenetupossa controllare l'elenco delle azioniin
$wp_actions
per vedere se è stato collegato correttamente. Potresti ancheimpostare unaproprietà di classe comeflag quando viene chiamata,mapenso davvero che siaeccessivo. Quando sitratta di cose legate ad azioni comeinit
,specialmente unafunzione come questa che deveessereeseguita solo una volta,i testfunzionali sono la soluzionemigliore. Verifica che abbianofatto quello che dovrebberofare,piuttosto che concentrarsi sulprovare atestare una singola unità come seilmetodofosse stato chiamato.Detto questo,puoi anche verificare cheilmetodo registriiltipo dipost annullando la registrazione deltipo diposte chiamandomanualmenteilmetodo. WordPressnon sembrafornire unafunzione
deregister_post_type()
,quindi dovrestifare confusione conilglobale$wp_post_types
direttamente. Potresti cancellareiltuotipo dipost da quelloe poi chiamareiltuometodoe controllare se è registrato dinuovo.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.-
Grazie!Sono statoin grado di confermare che l'azione `init` è stata chiamata.Ho ancoraproblemi con l'inizializzazione delplug-inin untestin cui devofornire argomenti al costruttore. Queltutorial èmolto utile.Primanonmi era chiaro chei test caricassero un ambiente completamente separato.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
-
Sono contento che abbia aiutato.A seconda di comefunzionailtuoplugin,potrestiesserein grado di reinizializzarlo semplicemente chiamandoil costruttore.Se questononfunziona davveroperte,potresti dovereseguire queitest separatamentee con unpo 'di codiceextraperinizializzarlo congli argomenti corretti.Puoi classificarei tuoitest aggiungendo l'annotazione `@groupmy_group_name`nei docblocks della classetestcase.Puoi quindiescludere ungrupponellatua configurazioneedeseguirlo separatamente con `phpunit --groupmy_group`.Quindi dovrai rilevare quando quelgruppo èin esecuzionee inizializzareilpluginin modo diverso.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.
-
Per unesempio di come rilevare qualegruppo èin esecuzionepuoiguardare [questo codicenelbootstrap di WordPress] (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.
Il costruttore dellamia classe aggiunge un'azione all'action hook "init":
Stavoprovando atestarloin uno unitteste allafine ho capito chenon c'eramotivoper cui l'action hook "init" si attivasse. C'è unmodoper verificare cheilmetodo register_my_type venga chiamatoe che venga registrato unnuovotipo dipost?
Modifica:
Laprincipalefonte dellamia confusione derivava dalnon comprendere la relazionetraphpunit,la suite ditest di WordPress,il codice dellamia classee ilmio codice ditest.
Quello che ora capisco è che congli strumentiper sviluppatori di WordPressinstallatinelmodoin cui è suggerito da questotutorial otramite WP-CLI ,un callto
phpunit
carica unfilebootstrap chepoi agganciailplugin all'action hookmuplugins_loaded
. Ilfilebootstrap carica quindi l'ambiente ditest di WordPress. Dopo che WordPress hafinito di caricare,vieneeseguito l'hookinit
. Il codice delplug-in che utilizzainit
dovrebbefunzionare comeprevisto.Itest sonoper lopiù solo codicenormale chefa uso difunzioni o classi disponibili. Ciò che è diversoin loro è che sono scritti comemetodi di una classe cheestende
WP_UnitTestCase
cheestendePHPUnit_Framework_TestCase
. Essereinclusiin questa classe dà aitest l'accesso alle asserzionie allefabbriche di oggettie eseguei metodisetUp
etearDown
in modo che ognitest siaindipendente dagli altri.