собственный конструктор и phpspec

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

class Something
{
  protected $property;

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

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

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

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

  it_is_initializable...

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

Кто-нибудь?


person Christophe    schedule 16.06.2015    source источник


Ответы (1)


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

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

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

class Something
{
    private $model;

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

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

person Jakub Zalas    schedule 18.06.2015
comment
Я это подозревал. Спасибо за подтверждение! - person Christophe; 19.06.2015