php - 为什么静态方法不可测试?

标签 php unit-testing static-methods

为什么静态方法不可测试?请举例说明(如果可能,请使用 PHP)。

最佳答案

静态方法本身并不是不可测试的,但如果被测试的对象调用静态方法,那么测试就不能“介于两者之间”并使其调用 stub 方法。如果被测试的对象改为调用常规方法,则测试可以为其提供一个具有该方法 stub 实现的替代对象。

一般来说,刚性依赖项的可测试性较差,而依赖注入(inject)(google it)使代码更可测试。

例如,假设我们有一个静态方法 getCurrentUser() 被我们正在测试的类使用,如下所示

class PostModel {
    //...
    public function getRecentPosts() {
        return $this->database->from('posts')
                ->where(array('user' => UserModel::getCurrentUser()))
                ->limit(10);
    }
}

现在 UserModel::getCurrentUser() 不能用 stub 方法替换。如果我们将其设为我们通过对象引用调用的常规方法,则我们可以在测试中传入另一个 stub 对象。

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);
    }
}

关于php - 为什么静态方法不可测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11591564/

相关文章:

java - 安卓 Volley : select data from MySQL database by id specified by user

javascript - 从同一文件获取 JSON 数据

php - 您将如何为此类类(class)编写测试?

java - 断言该值在java和testng或junit中的map中设置

php - WordPress 循环 : get current post count inside The Loop

javascript - 使用 php 在谷歌图表中获取值

asp.net-mvc - 如何测试 Asp.Net MVC View 是否无异常(exception)地呈现?

java - 是在第一次调用静态方法时自动创建的类的实例

Javascript,从静态函数打印全局对象

java - 重新定义派生类中的静态成员。 java