16

静的メソッドがテストできないのはなぜですか?親切に例証してください(可能であればPHPで)。

4

3 に答える 3

15

静的メソッド自体はテスト不能ではありませんが、テスト対象のオブジェクトが静的メソッドを呼び出す場合、テストは「間に入る」ことができず、代わりにスタブメソッドを呼び出すようになります。テスト対象のオブジェクトが代わりに通常のメソッドを呼び出す場合、テストはそのメソッドのスタブ実装を備えた代替オブジェクトをオブジェクトに与えることができます。

一般に、依存性の注入(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);
    }
}
于 2012-07-21T11:02:04.457 に答える
4

静的メソッドはテスト可能です:http ://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html (phpにあります)が、クラス間の相互作用をテストしたい場合(つまり、モックを使用)および偽のオブジェクト)おそらくそれを使用したくないでしょう。そうは言っても、phpunit3.5ではこれらをスタブ化できます。

phpで静的変数/関数を使用するのはいつですか?または、静的メソッドをいつ使用するかについての情報を検索してください。

クラス内で静的メソッドを使用します(つまり、privateまたはprotectedとマークされています)。これは、使用する言語の方が高速であるためです。

于 2012-07-21T11:03:02.680 に答える
3

明確に定義され Staticたメソッドは完全にテスト可能です。ご覧のとおり、問題はメソッド自体にあるのではなく、メソッドの依存関係にあります。メソッドとその依存関係(および依存関係の依存関係)がべき等である場合、問題はありません。Staticメソッドが、たとえばに依存する他のメソッドを呼び出している場合、問題が発生しますglobal

于 2012-07-21T11:18:50.013 に答える