0

我有实现特定接口并为特定数据库扩展基类的存储库类。

基类:

abstract class CouchDB
{
  protected $db;

  public function __construct(Sag $db)
  {
    $this->db = $db;
  }

  private function call_get($url) {...} //this is a wrapper for $db->get()
}

派生类:

class CouchExpression extends CouchDB implements ExpressionInterface
{
  public function __construct(Sag $db)
  {
    parent::__construct($db);
  }
}

规格:

class CouchExpressionSpec extends ObjectBehavior
{
  public function let($db)
  {
    $db->beADoubleOf('\Sag');

    $this->beConstructedWith($db);
  }

  public function it_gets_returned_by_its_id()
  {
     $this->db->get('...')->willReturn([]);
  }
}

运行 PHPSpec 时,我得到:property db not found 除了将属性设置为之外,还有其他方法可以解决此问题public吗?

将其设置为后,public我得到:call to a member function willReturn() on a non-object. 所以我无法继续->willReturn()运行$this->db

但为什么?在测试方法中执行此操作时let,它可以工作。但并非所有测试都需要返回相同的数据......

我如何让它运行?

4

1 回答 1

1

您可以在没有显式调用的情况下声明您的双精度,如下所示:

function let(\Sag $db)
{
    $this->beConstructedWith($db);
}

完成此操作后,如果您将同名属性传递给示例,它将是双精度的相同实例:

function it_gets_returned_by_its_id($db)
{
    $db->get('...')->willReturn([]);
}

此外,按照约定,let 和 example 方法不使用 public 关键字,它们无论如何都会公开,并且它可以减少示例周围的噪音。

于 2014-08-26T12:38:56.367 回答