使用常见内部属性的测试方法

时间:2017-11-02 17:12:11

标签: php unit-testing phpunit

我需要测试两种使用常见受保护属性的方法。第一种方法允许设置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');
}

看起来很丑陋。还有其他解决方案吗?

1 个答案:

答案 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。