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