1

前提

テストの実行時に異なる動作をするコードを書くことは、陽気に悪い習慣であることを私は知っていますが、実際にそれが必要になるかもしれないシナリオに出くわしたかもしれません。

具体的には、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フォルダーの構造とは少し異なります。)

質問

それをいじくり回した後、テストスコープ内にあるかどうかに応じてオートローダーローディングを選択する必要があると思います。

  1. トンネルビジョンが原因で表示されない両方の場合に、HTMLPurifierの自動読み込みルーチンを含める別のオプションはありますか?

  2. そうでない場合は、テスト環境と本番環境を自分のコード(例:APPLICATION_ENV)で区別する手段を見つける必要がありますか?またはPHPUnitは、定数を設定することで、この恐ろしいハッカーをネイティブにサポートしますか?defined() 、または同様のシェナニガン?(ここの私のグーグルフーは弱いです!私はおそらくそれを間違っているだけです。)

4

2 に答える 2

3

HTML Purifierの自動読み込みコードは、HTMLPurifier.auto.phpとは別のファイルに配置されています。つまり、HTMLPurifier_Bootstrapです。これには2つのメソッドがあります。実際に自動ロードを実行するautoloadと、ファイルが含まれていないgetPathは、ファイルの場所を示します。このファイルは、スタンドアロンとして明示的に設計されています。

残念ながら、私はZendのコードについて話す資格がありません。コードを試す前に、Bootstrapに追加のインクルードを実行するだけで済む場合があります。お役に立てば幸いです。

于 2010-03-31T15:35:29.710 に答える
1

実稼働環境とテスト環境の間の類似性(同一性ではないにしても)の要件については正しいのですが、構成はまだ多少異なります。つまり、ブートストラップはapplication.iniからさまざまなセクションをロードするため、フラグを渡すだけでsthのオン/オフを切り替えることができます(オートローダー機能のように)。

1).htaccessにSetEnv APPLICATION_ENVテストがあります(本番、開発、ステージングの可能性があります)。あなたはあなたのapache設定にもそれを持つことができます。2)Zend_Configがapplication.iniをロードするとき-get_env('APPLICATION_ENV')に従ってロードする-シナリオごとに異なるセクション(もちろん実際にはZend_Applicationに依存していますが、環境を理解するのに十分賢いです)3)常にそれぞれのセクションにフラグを追加し、コードからチェックしてください。

これが少し役立つことを願っています。

于 2010-03-31T11:07:51.253 に答える