Почему статические методы не проверяются?
Почему статические методы не проверяются? Пожалуйста, приведите пример (в PHP, если это возможно).
3 ответа
Сами статические методы не являются тестируемыми, но если тестируемый объект вызывает статический метод, тогда тест не может "встать между" и заставить вместо этого вызвать метод-заглушку. Если тестируемый объект вместо этого вызывает обычный метод, тест может дать ему альтернативный объект с реализацией заглушки этого метода.
В общем, жесткие зависимости менее тестируемы, а внедрение зависимостей (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);
}
}
Статические методы могут быть проверены: http://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html (он в php), но если вы хотите проверить взаимодействия между классами (то есть, используя mocks и поддельные объекты) вы, вероятно, предпочтете не использовать его. Это говорит о том, что Phpunit 3.5 позволяет заглушить их.
Вы также можете посмотреть, когда я использую статические переменные / функции в php? или найдите информацию о том, когда использовать статические методы.
Я использую статические методы внутри класса (т. Е. Помеченные как частные или защищенные), поскольку они быстрее в языке, с которым я работаю.
Вполне определенный Static
методы отлично проверяемы. Видите ли, проблема не в самом методе, а в его зависимостях. Если метод и его зависимости (и зависимости зависимостей) являются идемпотентными, тогда проблем нет. Проблемы возникают, когда ваш Static
методы вызывают другие методы, которые, например, зависят от global
,