Intereting Posts
PHP include (): размер и производительность файла Отправить значение переменной PHP во всплывающее окно JavaScript на той же странице Количество строк с PDO .htaccess или код защиты PHP от нескольких быстрых запросов Исключение SoapFault: Неподдерживаемый тип носителя при доступе к веб-сервису Java с PHP ошибка в таблице обновлений с помощью ON DUPLICATE KEY UPDATE Установка Laravel 4.1 в Windows 7 // Сделать файл .phar глобально доступным для командной строки Windows Большой PHP для цикла с SimpleXMLElement очень медленный: проблемы с памятью? Laravel 5.1 Session и Socket.IO + Redis – отправка уведомлений зарегистрированным пользователям (пользователям) и группе пользователей Передавать ассоциативные массивы BASH в PHP-скрипт Выполнить инструкцию для всех строк xml? jQuery – Только изменение для элемента с щелчком, не все с тем же классом Являются ли эти две функции излишними для дезинфекции? PHP эхо до функции сна, не работает Установка WordPress MSSQL

Почему статические методы являются неустойчивыми?

Почему статические методы являются неустойчивыми? Пожалуйста, продемонстрируйте (в PHP, если это возможно).

Статические методы сами по себе не являются неопровержимыми, но если тестируемый объект вызывает статический метод, тогда тест не может «встать между ними» и заставить его вместо этого вызвать метод заглушки. Если тестируемый объект вместо этого вызывает обычный метод, тест может дать ему альтернативный объект с реализацией этого метода.

В общем, жесткие зависимости менее проверяемы, в то время как инъекция зависимостей (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 .