PHPUnit:dataProvider不在PHPUnit_Framework_TestCase的子类中工作

时间:2015-03-03 09:42:49

标签: php unit-testing phpunit

我在我的测试中使用从PHPUnit_Framework_TestCase扩展的类。似乎@dataProvider对这些扩展类不起作用。

这只是一个简单的测试

namespace HH\Api\V10;

class StupidityTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
          [0, 0, 0],
          [0, 1, 1],
        ];
    }
}

phpunit返回此错误:

enter image description here

如果我使用\PHPUnit_Framework_TestCase代替TestCase,那么它可以正常工作。但它并不适用于这些扩展课程:TestCase& ApiTestCase

TestCase课程

namespace HH\Api\V10;

use HH\Api\ApiTestCase;

class TestCase extends ApiTestCase
{
}

ApiTestCase课程

namespace HH\Api;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\Response;

class ApiTestCase extends \PHPUnit_Framework_TestCase
{
    protected $client = null;

    public function __construct()
    {
        parent::__construct(); // <--have called parent constructor
        $this->client = new Client([
            'base_url' => $this->url(),
        ]);
    }
    ....
}

任何帮助都会非常感激。感谢

2 个答案:

答案 0 :(得分:3)

终于弄明白为什么它没有成功。

子类的构造函数需要与父类PHPUnit_Framework_TestCase的构造函数相同。

class ApiTestCase extends \PHPUnit_Framework_TestCase
{
    protected $client = null;

    public function __construct($name = null, array $data = array(), $dataName = '')
    {
        parent::__construct($name, $data, $dataName);
        ...
    }
 ...
}

但我发现更好的方法不是通过构造函数,而是使用fixture。

public function setUp()
{
    $this->client = new Client([
        'base_url' => $this->url(),
    ]);
}

答案 1 :(得分:1)

您应该使用setUp fixture来设置$client