Dataprovider可以从setUp获取连接

时间:2014-12-04 05:54:51

标签: phpunit

通过setUp()连接到数据库失败

class ChanTest extends PHPUnit_Framework_TestCase
{
    protected $db;

    protected function setUp()
    {
        $this->db = new Core\Database('unitest');
    }

    /**
     * @dataProvider testProvider
     */
    public function testData($a, $b, $c)
    {
        $this->assertEquals($a + $b, $c);
    }

    public function testProvider()
    {
        $this->db->query('SELECT `a`, `b`, `c` FROM `units`');

        return $this->db->rows();
    }
}

连接到数据库本身

class ChanTest extends PHPUnit_Framework_TestCase
{
    protected $db;

    protected function setUp()
    {
        $this->db = new Core\Database('unitest');
    }

    public function testData($a, $b, $c)
    {
        $this->db->query('SELECT `a`, `b`, `c` FROM `units`');

        foreach ($this->db->rows() as $item) {
            $this->assertEquals($item['a'] + $item['b'], $item['c']);
        }
    }
}

如果我通过setUp function通过dataProvider连接数据库,则会响应Fatal error: Call to a member function query(),但如果连接到数据库本身有效,则可以dataProvider获取setUp function&#39}。设置?

3 个答案:

答案 0 :(得分:10)

这是设计的:为了确定测试的数量,PHPUnit在实际运行测试(和setUp方法)之前运行dataProviders。

来自manual on DataProviders

  

注意:   在调用setUpBeforeClass静态方法和第一次调用setUp方法之前执行所有数据提供程序。因此,您无法从数据提供程序中访问您在其中创建的任何变量。这是PHPUnit能够计算测试总数所必需的。

在你的情况下,我会为数据库使用单例/实例模式。

答案 1 :(得分:3)

另一种方法是使用variable variables

public function test_foo( $var_name ) {
    var_dump( 
        self::${ $var_name } // This is the same as `self::$bar`.
    );
}

public function data_foo() {
    return array(
        array(
            'bar', // This is a _string_ containing the _name_ of the variable, not the variable itself. 
        ),
    );
}

您的数据提供者传递变量的名称,测试函数使用该变量直接访问静态成员。

答案 2 :(得分:0)

尝试覆盖构造函数:

public function __construct($name = null, array $data = [], $dataName = '')
{
    $this->db = new Core\Database('unitest');
}