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

Почему статические методы не проверяются? Пожалуйста, приведите пример (в 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,

Другие вопросы по тегам