How can I reference external data providers in phpunit? How can I reference external data providers in phpunit? symfony symfony

How can I reference external data providers in phpunit?


You need to reference the data provider using the fully-qualified classname:

namespace AppBundle\Tests\Controller;use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;class DefaultControllerTest extends WebTestCase{    /**     * @dataProvider \AppBundle\Tests\DataProvider\XmlDataProvider::xmlProvider     * @covers ReceiveController::receiveAction()     * @param string $xml     */    public function testReceive($xml)    {        // ...    }}

Autoloading

Also, make sure to adjust your autoload configuration in composer.json, so the data provider can be autoloaded (might need adjustment depending on which directory the ’AppBundle\Test` namespace maps to):

{    "autoload-dev": {        "psr-4": {            "AppBundle\\Tests\\": "tests/"        }    }}

Alternatively, since you suggest your autoloading configuration looks like this:

{    "autoload-dev": {        "psr-4": {            "Tests\\": "tests/"        }    }}

you need to adjust your namespace for the presented tests from AppBundle\Tests to Tests\AppBundle.

Note Unrelated to your question, but personally, I can't see a need for the data provider to extend WebTestCase.

For examples, see:


PHPUnit Provider Autoloader

Magic helper to autoload CSV, JSON, PHP, XML and YAML data provider in PHPUnit.

Instalation

composer require redaxmedia/phpunit-provider-autoloader

Usage

Create the TestCaseAbstract for your testing suite:

<?phpnamespace ExampleProject\Tests;use PHPUnitProviderAutoloader;/** * TestCaseAbstract * * @since 2.0.0 * * @package ExampleProject * @category Tests */abstract class TestCaseAbstract extends PHPUnitProviderAutoloader\TestCaseAbstract{    /**     * directory of the provider     *     * @var string     */    protected $_providerDirectory = 'tests' . DIRECTORY_SEPARATOR . 'provider';    /**     * namespace of the testing suite     *     * @var string     */    protected $_testNamespace = __NAMESPACE__;}

Extend from TestCaseAbstract to autoload the ExampleTest{_testMethod}.{csv|json|php|xml|yml} file:

<?phpnamespace ExampleProject\Tests;/** * ExampleTest * * @since 2.0.0 * * @package ExampleProject * @category Tests */class ExampleTest extends TestCaseAbstract{    /**     * testMethod     *     * @since 2.0.0     *     * @param string $expect     *     * @dataProvider providerAutoloader     */    public function testMethod(string $expect = null)    {        $this->assertEquals($expect, 'test');    }}

Read more

Related repository: https://github.com/redaxmedia/phpunit-provider-autoloader

Example integration: PHP test autoloads PHP class provider and PHP method provider