前提
テストの実行時に異なる動作をするコードを書くことは、陽気に悪い習慣であることを私は知っていますが、実際にそれが必要になるかもしれないシナリオに出くわしたかもしれません。
具体的には、ZendフレームワークでHTML Purifierの非常に特殊なラッパー(正確にはView Helper)をテストしようとしています。HTML Purifierオートローダーは、他の方法で使用しているオートローダーとは異なるロジックを使用するため、必要です。
問題
require()- View Helperクラスの最上位にあるオートローダーを実行すると、テストスコープで次のようになります。
HTML Purifierオートローダーレジストラは、PHPバグ#44144のため、非静的オブジェクトメソッドと互換性がありません。HTMLPurifier.autoload.php(またはこのファイルを含むファイル)は使用しないでください。代わりに、コード:spl_autoload_register(array('HTMLPurifier_Bootstrap'、'autoload'))を独自のオートローダーの後に配置します。
require()をアドバタイズされたとおりに置き換えるspl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'))
と、テストは正常に実行されますが、ViewHelperは次のように主張してひどい死を迎えます。
Zend_Log [3707]:ErrorControllerがLogicExceptionをキャッチしました "渡された配列は既存の静的メソッドを指定していません(クラス'HTMLPurifier_Bootstrap'が見つかりません)"
(テストフォルダーの構造は、必要に応じてZendフォルダーの構造とは少し異なります。)
質問
それをいじくり回した後、テストスコープ内にあるかどうかに応じてオートローダーローディングを選択する必要があると思います。
トンネルビジョンが原因で表示されない両方の場合に、HTMLPurifierの自動読み込みルーチンを含める別のオプションはありますか?
そうでない場合は、テスト環境と本番環境を自分のコード(例:APPLICATION_ENV)で区別する手段を見つける必要がありますか?またはPHPUnitは、定数を設定することで、この恐ろしいハッカーをネイティブにサポートしますか?defined() 、または同様のシェナニガン?(ここの私のグーグルフーは弱いです!私はおそらくそれを間違っているだけです。)