我需要测试两种使用常见受保护属性的方法。第一种方法允许设置PDO实例,第二种方法使用实例从数据库中选择一些数据,所以我必须逐个测试它们。
class SomeClass {
protected $db; // PDO instance
public function setDb($db){
// ... some code
return $this->db = $db;
}
public select($name){
return $this->db->query('SELECT * FROM ...');
}
}
我尝试对@depends setDb
方法使用select
注释,但它不起作用 - db
属性为null。我找到的唯一一个工作解决方案 - 在测试setDb
方法之前调用select
/**
* @covers SomeClass::select
* @depends testSetDb
*/
public function testSelect()
{
$this->object->setDb($this->pdo);
$actual = $this->object->select('value');
$this->assertTrue($actual === 'something');
}
看起来很丑陋。还有其他解决方案吗?
答案 0 :(得分:1)
/**
* @test
*/
public function blaTest() {
$pdo = $this->prophesize(PDO::class);
$this->object->setDb($pdo->reveal());
$pdo
->query('SELECT * FROM something')
->shouldBeCalled()
->willReturn('test works');
self::assertEquals(
'test works',
$this->object->select('something')
);
这样你在注入模拟器的同时测试setter来测试select-method中的db-call。