2016-10-01 15 views
1

私はリファクタリングを行い、phpunitテストを追加するかなり皮肉なPHPアプリケーションを持っています。アプリケーションの一般的な状況は、誤った設定(アプリケーションが構成ファイルを取り込み、画像とHTMLを出力として生成する)に対するユーザーの警告メッセージです。 PHPunit - ユーザのエラー状態(例外ではない)をテストするためのベストプラクティス

は、だから私は同様だアプリケーションを介して振りかけコードの束を持っている:wm_warnは標準エラー出力または文脈に応じて、ログファイルのいずれかに書き込み

wm_warn("You can't make a contrast with 'none' - guessing black. [WMWARN43]\n"); 

これらの警告をphpunitでどのようにテストできますか?

重要:これは致命的なエラーではないため、AFAIKは例外に置き換えてphpunitの「予想される例外」機能を使用することはできません。

これはwm_warn模擬のユースケースですか?または標準エラーをキャプチャしますか?あるいは、別のロギング方法を使用してテストを簡単にする(例えばlog4php)?

答えて

1

モッキングは適切なソリューションであるかもしれない、PHPUnitのマニュアルのようなモック説明:

メソッドが呼び出されたことを主張例えば、 予想を検証するテストダブルでオブジェクトを置き換えるの実施mockingと呼ばれる です。

wm_warnが呼び出されましたが、実行されていないことがわかりました(ログには何も表示されません)。

Simple Mockingについては、PHPUnit Test Doublesのトピック(上の引用事項についても説明しています)をご覧ください。あなたが直面する可能性のある問題の1つは、オブジェクトをモックすることができますが、ストレート関数ではないことです。アプリの真っ暗さに依存します。

+1

ありがとうございました。現在のログ関数は実際の関数ですが、ログオブジェクトのメソッドを簡単に呼び出すことができます(すべてをフォールディングして、後でログオブジェクトへの直接呼び出しにすることができます)。 – AnotherHowie

+0

@AnotherHowie聞いてうれしいのはあなたのために働くことができます! – Katie

1

モッキング(またはスパイ)アプリケーションに応じて(あなたはかなり皮肉だと言った)

どのように機能がロードされていますか? wp_warn関数を含む関連ファイルを含む呼び出しを傍受することができる場合は、代わりに独自の模擬バージョンを使用するように変更することができます。このバージョンでは、呼び出されたパラメータ(つまりエラー)を(urgh、shudderテストケースにアクセス可能である)グローバル変数:wp_warn-test.phpをに

//... 
if (defined('TEST_ENVIRONMENT')) { 
    require_once 'wp_warn-test.php'; 
} else { 
    require_once 'wp_warn.php'; 
} 
//... 

function wp_warn($error) 
{ 
    $_GLOBALS['SPY_WP_WARN_ERRORS'][] = $error; 
} 

とテストで:

$this->assertContains("You can't make a contrast with 'none' - guessing black. [WMWARN43]\n", $_GLOBALS['SPY_WP_WARN_ERRORS']); 

特にグローバル変数を使用するのは非常に醜いですが、テストができたら、将来リファクタリングしてより洗練されたソリューションを見つける機会が増えます。

+0

wm_warnは別のファイルに置くことができます(現時点ではありません)。グローバルロギングオブジェクトのメソッドを呼び出すラッパーであると考えています。そのラッパーはモック可能で置き換え可能です。 1つの場所でも処理されるべき他のいくつかのログレベル(デバッグ、トレース)があります。私はすでに、非デバッグモードでdebug()呼び出しが可能な限り短く、スタブ関数を持つ別のログオブジェクトを持つように、何らかのLogObjectFactoryを持っていると考えていました。 – AnotherHowie

関連する問題