如何在phpunit中引用外部数据提供程序?

时间:2017-08-24 16:06:03

标签: php symfony phpunit composer-php tdd

我正在尝试使用PHPUnit中的通用数据提供程序运行一些测试。

见下面的测试:

    namespace AppBundle\Tests\Controller;

    use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
    use AppBundle\Tests\DataProvider\XmlDataProvider;

    class DefaultControllerTest extends WebTestCase
    {
        /**
         * @dataProvider XmlDataProvider::xmlProvider
         * @covers ReceiveController::receiveAction()
         * @param string
         */
        public function testReceive($xml)
        {
            $client = static::createClient([], ['HTTP_HOST' => 'mt.host']);
            $client->request(
                'POST',
                '/receive',
                [],
                [],
                [],
                $xml
            );

            $response = $client->getResponse();
            $this->assertEquals(200, $response->getStatusCode());
        }
    }

现在我想要一个外部数据提供者类:

namespace AppBundle\Tests\DataProvider;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class XmlDataProvider extends WebTestCase
{
    /**
     * @dataProvider
     */
    public static function xmlProvider()
    {
        return array([
            'xml1' => '<?xml version="1.0" encoding="UTF-8"?><myTestableXml></myTestableXml>'
        ]);
    }
}

但是当我运行phpunit时,我得到了:

  

1)警告指定的数据提供者   AppBundle \ Tests \ Controller \ DefaultControllerTest :: testReceive是   无效。类XmlDataProvider不存在

     

2)警告课堂上没有发现任何测试   “的appbundle \测试\的DataProvider \ XmlDataProvider”。

我该怎么做?

更新

composer.json自动加载片段供参考:

"autoload": {
    "psr-4": {
        "AppBundle\\": "src/AppBundle",
        "Tests\\": "tests"
    },
    "classmap": [
        "app/AppKernel.php",
        "app/AppCache.php"
    ]
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    },
    "files": [
        "vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"
    ]
},

2 个答案:

答案 0 :(得分:3)

您需要使用完全限定的类名引用数据提供程序:

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)
    {
        // ...
    }
}

自动加载

此外,请确保在composer.json中调整自动加载配置,以便数据提供程序可以自动加载(可能需要调整,具体取决于'AppBundle \ Test`命名空间映射到的目录):

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

或者,因为您建议您的自动加载配置如下所示:

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

您需要针对从AppBundle\TestsTests\AppBundle的呈现测试调整命名空间。

注意与您的问题无关,但就个人而言,我无法看到数据提供商需要扩展WebTestCase

例如,请参阅:

答案 1 :(得分:2)

PHPUnit Provider自动加载器

  

魔术助手,可在PHPUnit中自动加载CSV,JSON,PHP,XML和YAML数据提供程序。

安装

composer require redaxmedia/phpunit-provider-autoloader

用法

为您的测试套件创建TestCaseAbstract:

<?php
namespace 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__;
}

从TestCaseAbstract扩展以自动加载ExampleTest {_testMethod}。{csv | json | php | xml | yml}文件:

<?php
namespace 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');
    }
}

了解详情

相关存储库:https://github.com/redaxmedia/phpunit-provider-autoloader

集成示例:PHP test自动加载PHP class providerPHP method provider