chadicus/test-helpers

Classes designed to assist with PHPUnit testing

v3.0.0 2023-07-05 15:00 UTC

This package is auto-updated.

Last update: 2024-12-05 18:03:14 UTC


README

Latest Stable Version Latest Unstable Version License

Total Downloads Daily Downloads Monthly Downloads

Requirements

Test Helpers requires PHP 7.3 (or later).

Composer

To add the library as a local, per-project dependency use Composer! Simply add a dependency on chadicus/test-helpers to your project's composer.json file such as:

composer require --dev chadicus/test-helpers

NOTE: test-helpers should never be used in production. They are meant for testing enviornments only.

Documentation

PHP docs for the project can be found here.

Contact

Developers may be contacted at:

Project Build

With a checkout of the code get Composer in your PATH and run:

composer install
composer run test
composer run lint

\Chadicus\FunctionRegistry

Some internal PHP functions are documented to return certain values on failure. If you're a meticulous programmer you want to account for these return values in your code and respond to them accordingly.

class MyClass
{
    public function doSomething()
    {
        $curl = curl_init();
        if ($curl === false) {
            throw new \Exception('curl_init() failed');
        }

        //do something with $curl ...
    }
}

A meticulous programmer may also want to ensure their unit test code coverage is 100%.

One way to accomplish this is to use @codeCoverageIgnore annotations

class MyClass
{
    public function doSomething()
    {
        $curl = curl_init();
        if ($curl === false) {
            //@codeCoverageIgnoreStart
            throw new \Exception('curl_init() failed');
            //@codeCoverageIgnoreEnd
        }

        //do something with $curl ...
    }
}

This gets us the code coverage but the code isn't really tested.

The FunctionRegistry class alows you to mock an internal PHP function

class MyClassTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        // prepare the curl functions for mocking
        \Chadicus\FunctionRegistry::reset(__NAMESPACE__, array('curl'));
    }

    /**
     * @expectedExceptionMessage curl_init() failed
     */
    public function testCurlInitFails()
    {
        \Chadicus\FunctionRegistry::set(
            __NAMESPACE__,
            'curl_init',
            function () {
                return false;
            }
        );

        $myClass = new MyClass();

        // this will call our custom curl_init function
        $myClass->doSomething();
    }
}

For functions and constants, PHP will fall back to global functions or constants if a namespaced function or constant does not exist. It is because of this behavior that we can mock internal functions.