Ответ 1
Статические методы сами по себе не являются неопровержимыми, но если тестируемый объект вызывает статический метод, тогда тест не может "поселиться" между ними и заставить его вместо этого вызвать метод заглушки. Если тестируемый объект вместо этого вызывает обычный метод, тест может дать ему альтернативный объект с реализацией этого заглушки.
В общем, жесткие зависимости менее проверяемы, в то время как инъекция зависимостей (google it) делает код более подверженным тестированию.
Например, скажем, у нас есть статический метод getCurrentUser()
, который используется тестируемым классом, следующим образом
class PostModel {
//...
public function getRecentPosts() {
return $this->database->from('posts')
->where(array('user' => UserModel::getCurrentUser()))
->limit(10);
}
}
Теперь UserModel::getCurrentUser()
нельзя заменить на метод заглушки. Если мы сделаем его обычным методом, который мы вызываем через ссылку на объект вместо этого, мы можем передать альтернативный объект-заглушку в нашем тесте.
class PostModel {
private $userModel;
public function __construct($userModel) {
$this->userModel = $userModel;
}
//...
public function getRecentPosts() {
return $this->database->from('posts')
->where(array('user' => $this->userModel->getCurrentUser()))
->limit(10);
}
}