Пользовательский конструктор и phpspec

У меня есть этот класс, который я хочу проверить в phpspec:

class Something
{
  protected $property;

  public function __construct($someId)
  {
    $this->property = Model::find($someId);
  }
}

Model:: find () возвращает экземпляр Model.

И я не хочу, чтобы phpspec использовал БД и т. Д. Я пытался

class SomethingSpec
{
  public function let(Model $model)
  {
    $this->property = $model;
  }

  it_is_initializable...

Но это не работает.

Кто-нибудь?

1 ответ

Решение

PhpSpec призывает вас позаботиться о том, как разрабатывается код. Многие вещи не могут помешать вам навредить себе. Это по замыслу. Если вы хотите сделать то, что вы представили в вопросе, используйте другой инструмент (например, phpunit).

Доступ к Model::find($someId) от конструктора не является хорошим дизайном и не поддается тестированию (см. Инверсия зависимости и другие принципы SOLID).

Вы должны внедрить свою зависимость от внешнего контекста. Либо залить Model экземпляр или результат Model::find() вызов:

class Something
{
    private $model;

    public function __construct(Model $model)
    {
        $this->model = $model;
    }
}

Сначала начните со спецификации, прежде чем писать код. Это сделает вашу жизнь проще.

Другие вопросы по тегам