имитация базы данных в производном классе

У меня есть классы репозитория, которые реализуют определенный интерфейс, а также расширяют базовый класс для конкретной базы данных.

базовый класс:

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методе теста это работает. Но не все тесты требуют возврата одних и тех же данных...

Как мне запустить это?


person soupdiver    schedule 26.08.2014    source источник


Ответы (1)


Вы можете объявить своего двойника без явного вызова, например:

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

Сделав это, если вы передадите свойство с тем же именем в свой пример, это будет тот же экземпляр двойника:

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

Кроме того, по соглашению методы let и example не используют ключевое слово public, они в любом случае будут общедоступными, и это уменьшит шум вокруг ваших примеров.

person shanethehat    schedule 26.08.2014