[解決済み] PHPUnitでプライベートメソッドをモックする
質問
PHPUnit を使ってクラス内のプライベートメソッドをモックする方法について質問があります。例を挙げて紹介します。
class A {
public function b() {
// some code
$this->c();
// some more code
}
private function c(){
// some code
}
}
をテストするために、プライベートメソッドの結果をどのようにスタブすればよいですか? もう少しコード の部分をテストすることができます。
を読んで部分的に解決 はこちら
どのように解決するのですか?
通常、private & protected メソッドを直接テストしたりモックしたりしないだけです。
あなたがテストしたいのは public API です。他のすべては、あなたのクラスの実装の詳細であり、あなたがそれを変更した場合、あなたのテストは "break"べきではありません。
また、パブリックAPIを呼び出しても実行できないコードがクラス内にあるかもしれないので、"100%のコードカバレッジが得られない"ということに気づいたときにも役立ちます。
通常、このようなことはしたくありません。
しかし、もしあなたのクラスがこのようなものだとしたら。
class a {
public function b() {
return 5 + $this->c();
}
private function c() {
return mt_rand(1,3);
}
}
random"関数はグローバルな状態であり、それをテストすることができないので、c()をモックアウトする必要性を理解することができます。
きれいな(quot;verbose;overcomplicated-maybe;i-like-it-usually")解決策。
class a {
public function __construct(RandomGenerator $foo) {
$this->foo = $foo;
}
public function b() {
return 5 + $this->c();
}
private function c() {
return $this->foo->rand(1,3);
}
}
これで、グローバルが含まれないので、モックを作成する必要がなくなり、きれいにテストができるようになりました。
プライベート関数からグローバル状態を削除したくない、または削除できない場合(悪いこと悪い現実、または悪いことの定義が異なるかもしれません)、次のようにします。 ができます。 モックに対してテストしてください。
// maybe set the function protected for this to work
$testMe = $this->getMock("a", array("c"));
$testMe->expects($this->once())->method("c")->will($this->returnValue(123123));
で、このモックに対してテストを実行します。モックから取り出す関数は "c()" だけです。
Pragmatic Unit Testing"の本を引用すると。
一般的に、テストのためにカプセル化を壊したくはないでしょう(あるいは、ママがよく言っていたように、" don't expose your privates!" )。ほとんどの場合、パブリックメソッドを実行することで、クラスをテストすることができるはずです。プライベートまたは保護されたアクセスの背後に隠されている重要な機能がある場合、それは別のクラスが外に出ようと奮闘しているという警告サインかもしれません。
関連
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] phpunitで単一のテストメソッドを実行する方法は?
-
[解決済み] モックとスタブの違いは何ですか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み】PHPUnitでprotectedメソッドをテストするためのベストプラクティス
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
-
[解決済み】テストのInitメソッドでHttpContext.Currentをモックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] PHP 未定義関数への呼び出し