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

次のように、明示的な呼び出しなしで double を宣言できます。

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

これを行った後、同じ名前のプロパティを例に渡すと、double の同じインスタンスになります。

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

また、慣例により、 let メソッドと example メソッドは public キーワードを使用しません。いずれにせよ public になり、例の周りのノイズが減ります。

于 2014-08-26T12:38:56.367 に答える