A framework to build unit tests with OTGS products
This package is auto-updated.
Last update: 2023-12-02 12:35:14 UTC
- Create a
testsdirectory in your project
- Create a
samples/phpunit.xmlfile in the root of your project2
test-suite-nameinto something appropriated
- Most likely, you won't need to change anything else in that file
- Read the comments in this file and make the appropriated changes
composer require --dev otgs/unit-tests-framework3
- Create another
- Write your tests there
- Unless you have customized the
phpunit.xmlfile, you don't need to name the test files and classes in any particular way
phpunitfrom your project's root to start your tests4
In order to take the most of this library, all your tests classes should extext
Once you do that, this will happen:
$_POSTare set to an empty array
- An instance of
FactoryMuffinis provided: you can refer to it as
self::$fm(see "Resources and dependencies" for more details)
FunctionMockeris initialized (see "Resources and dependencies" for more details)
WP_Mockis initialized (see "Resources and dependencies" for more details)
Mockeryis destroyed (just in case it has been used)
- Deletes all models created with
This class also provide an helper method to quickly mock the functions defined by WordPress by using the
\OTGS_TestCase::get_mocked_wp_core_functions which returns an instance of
OTGS_Mocked_WP_Core_Functions organize mocks in methods named using the same name of the file where the function is defined in WordPress codebase.
For instance, to mock of all functions defined in
get_post, in your test you should simply call
add_query_arg yo call
add_query_arg is defined in
OTGS_Mocked_WP_Core_Functions tries to handle dependencies.
So, if you call
$this->get_mocked_wp_core_functions()->post() to mock
wp_insert_post, you automatically call
$this->get_mocked_wp_core_functions()->post(), so to get all the meta related functions mocked as well.
Finally, there is a "mock all" method you could use (though is discouraged) with
\OTGS_TestCase provides a helpful way to quickly get a stub of some of the most commonly used classes in WordPress.
$this->stubs->wpdb() you will get a stub you can pass as a dependency of the classes you are testing.
If you need to control the behavior of this stub, you just use the standard PHPUnit mock helpers.
$wpdb = $this->stubs->wpdb(); $wpdb->method( 'get_var' )->willReturn( 1 );
$results = array( array( 'translation_id' => 1, 'element_id' => 1, 'language_code' => 'en', 'source_language_code' => null, 'trid' => 1, 'element_type' => 'post_page' ), array( 'translation_id' => 2, 'element_id' => 2, 'language_code' => 'fr', 'source_language_code' => 'en', 'trid' => 1, 'element_type' => 'post_page' ), ); $wpdb = $this->this->wpdb(); $wpdb->expects( $this->exactly( 2 ) )->method( 'get_results' )->willReturn( $results );
Other stubs you can get:
It is important to know that, if you only need the class to be defined (e.g. hard-dependency, or sub-classing), you don't need to assig the stub to a variable: just call the method.
A good example is with WordPress' widgets, where you may have your own widget which is supposed to extend
In this case, unless you want to mock some of the
WP_Widget methods, you simply call
$this->stubs->WP_Widget(), then write your tests.
The class which extends
WP_Widget will find a definition of this class, with all the methods (doing nothing).
Below are some resources on writing unit tests which lead to the creation of this library and links to the libraries included here:
- Start from here for a general explanation: http://wordpress.stackexchange.com/a/164138/7291
- 10up's WP_Mock`: https://github.com/10up/wp_mock
- Mockery: https://github.com/padraic/mockery
- Function mocker: https://github.com/lucatume/function-mocker
- Factory Muffin: https://github.com/thephpleague/factory-muffin
- Factory Muffin Faker: https://github.com/thephpleague/factory-muffin-faker
- The DomCrawler Component: http://symfony.com/doc/current/components/dom_crawler.html
- The CssSelector Component: http://symfony.com/doc/current/components/css_selector.html
- php-loremipsum: https://github.com/joshtronic/php-loremipsum
it is recommended to keep your PHPUnit tests into a subfolder, because there are good changes you want to add other kind of tests (e.g. QUnit, PHPSpec, etc.) ↩
in case, for whatever reason, you can't do that, copy this file in
tests/phpunitor wherever you find it more convenient ↩
In some cases, you may want to use
composer require --dev otgs/unit-tests-framework:dev-develop. When you do that, you may also need to run this command first
composer config minimum-stability dev↩
If you've placed the
phpunit.xmlyou need to either move to that directory first, or tell phpunit where the file is with
phpunit --configuration path/to/phpunit.xml↩