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}。设置?
答案 0 :(得分:10)
这是设计的:为了确定测试的数量,PHPUnit在实际运行测试(和setUp方法)之前运行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');
}