Пользовательский конструктор и 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;
}
}
Сначала начните со спецификации, прежде чем писать код. Это сделает вашу жизнь проще.