phpunitおよびautoloaders:テストスコープでコードが実行されているかどうかを判断しますか?
-
23-09-2019 - |
質問
前提
テストが実行されたときに異なる行動をとるコードを書くことは陽気に悪い練習であることを知っていますが、実際にそれが必要かもしれないシナリオに出くわしたかもしれません。
具体的には、正確には、Zend Framework(ビューヘルパー)でHTML浄化器の非常に具体的なラッパーをテストしようとしています。 HTML清浄機の自動装置は、そうでなければ持っているオートローダーとは異なるロジックを使用するため、必要です。
問題
必要とする()- 私のビューヘルパークラスの一番上にオートローダーをすると、以下を提供します テストスコープで:
HTML Purifier Autoloaderレジストラは、PHPバグ#44144のため、非静的オブジェクトメソッドと互換性がありません。 htmlpurifier.autoload.php(またはこのファイルを含むファイル)を使用しないでください。代わりに、コード:spl_autoload_register(array( 'htmlpurifier_bootstrap'、 'autoload'))を自分の自動装置に配置します。
置き換えます 必要とする() と spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'))
宣伝されているように、テストは正常に実行されますが、ビューヘルパーはひどい死を主張して死にます。
Zend_log [3707]:ErrorController Cated LogiceXception「渡された配列は、既存の静的メソッドを指定しません(クラス 'htmlpurifier_bootstrap' not in not inger)」
(必要に応じて、テストフォルダーの構造はZendフォルダー構造とわずかに異なります。)
質問
それをいじくり回した後、私は、物事がテスト範囲にあるかどうかに応じて、自動剤を搭載する必要があると思っています。
トンネルビジョンのために見られないどちらの場合も、HTMLPurifierの自動装備ルーチンを含める別のオプションがありますか?
そうでない場合は、テスト環境と生産環境を自分のコード(application_env)で区別する手段を見つける必要がありますか?その間 定義(), 、または同様のシェナンガン? (ここの私のGoogle-Fuは弱いです!私はおそらくそれを間違っているだけです。)
解決
html浄化器には、htmlpurifier.auto.phpとは異なるファイルに自動ローディングコードが配置されています。つまり、htmlpurifier_bootstrap。 2つの方法があります。実際にAutoloadを実行するAutoloadとGetPathは、ファイルがどこにあるかを伝えるファイルを含めないGetPathです。このファイルは、独立するように明示的に設計されています。
残念ながら、私はZendのコードについて話す資格がありません。コードを試す前に、ブートストラップに追加の追加を行うことで逃げることができるかもしれません。それが役立つことを願っています!
他のヒント
まあ、あなたは生産環境とテスト環境の間の類似性(アイデンティティではないにしても)要件について正しいですが、私はまだいくらか異なる構成を持っています。ブートストラップは、application.iniとは異なるセクションをロードすることを意味します。そのため、フラグを渡してSTHをオン/オフにするために単純に渡すことができます(そのAutoLoader機能のように):
1).htaccessでsetenv application_envテストを持っています(生産、開発、ステージングである可能性があります)。 Apacheの構成にも含めることができます。 2)zend_configがapplication.ini- get_env( 'application_env')に従ってロードする場合 - さまざまなシナリオの異なるセクション(実際にはzend_applicationに依存していますが、環境を理解するのに十分賢いです)3)常にそれぞれのセクションにフラグを追加し、コードから確認してください。
これが少し役立つことを願っています。