uzullaがブログスマートフォン用の表示で見るuzullaがブログuzullaがブログです。2019ですね、楽しみなuzullaです。Hachioji.pmのSlackでPHPのテスト手法について質問があって、結果的にその解決策はいいのが無かったんですけど、過去こういうことはしたことがあるよってメモ書きです。コンボがアンチパターンですので、イケてるフレームワークを正しく使う方々には本エントリは役立たないはずです。PHPのexitは終了してしまうさて、phpで以下みたいな「リダイレクトした直後にexit」というコードはしばしば見かけるものです。exit;}ぐぐってみるとわかりますが、本当に多くて、本当かよと思います。実際俺もかいてた事があるので本当です。いうコードをテストしようと思うと、理論上以下みたいになるので、phpunitが終了します。いうこともできないregister_shutdown_functionとかを知っていると、以下みたいにかけるかなと思いますが、わりとできません。}}register_shutdown_functionのスコープはphpunitの外にとびでちゃうので、ここで投げてもphpunitがキャッチしてくれません(というふうに私は認識しています)そもそもexitはphpunitをまるごと殺そうとしますので、キャッチできたとしてもdieまっしぐらです。}}他の言語の経験があると、一見できそうです。evalはやっぱりこのスコープで実行されるのでダメです。(終了しちゃいます)https://www.php.net/manual/ja/function.eval.php解決策は?無い(迫真)無いので、以下みたいなものもあるようです。ブクマも数件ついてます、皆さん悩みは一緒ですね。PHPで、exit/dieでphpunitを殺さない黒魔術をご存知の方は教えてください。「runkitは?」という声もきこえてきますが、exitは関数ではない。(動的な)ソースフィルタは?という怖い声がきこえてきますが、尋常な精神では無理。「いやいや、コードをリファクタしようよ!」という正気の意見はここでは黙殺します、世の中にはできないこともある。「exitを例外に単純置換しよう!」といったある意味PHPerらしい動けばいい系アドホック解決策は、解決はするかもしれませんが早晩似たような地獄に到達するのでやめたほうがよいです。(え?exitの代わりにユーザー定義な致命的Errorを投げる?...フム、興味深さもありますね)で、結局、exitが絡む時にphpunitを殺さない為には別プロセスで実行するしかない*1。みんな大好きなexecしましょう(正気かギリギリのライン)事案で、「私の場合は」あるリダイレクトがちゃんと指定のURLにリダイレクトされているか確認したかったことがある。非常にアレなのでわすれてましたが、こういうことを過去してしまいました。}}安易に真似されても何なので説明は省略しますが、exitが呼ばれた時にセットされていたヘッダーを、標準出力の文字列経由で配列で受け取って検証する、という感じです。書いておいて唐突ですが、これは本当によくないので、アンチパターンですね、マネしないようにしましょう!!(なお、「headers_listしなくても出力のヘッダーを分離すればいいだけじゃん?」というご質問については全くそうなのですが、私は文字列操作が嫌いだったようです、上の中でもめっちゃしてるくせに)がんばってseleniumとかpuppeteerとかでE2Eしような!!header吐いてexitしちゃう、しかもreq/resオブジェクトみたいなは無いし、テストできない。いったレガい案件ではすなおにE2Eするのがセオリーなのだと思います。俺だって人にきかれたらそう答える。人も金もなく、ガンガン走らせたいユニットテストごときにヘッドレスブラウザを飼育するのもコスパがよいとはいえません。そのために人はこういった苦難の道を歩みがち、実に人生という感じがします。素直に最初テスタブルなアプリにしましょう。人生には取り返しのつかない事だってあるよね。こちらからは以上です。AdventCalendar2014です。サービスを追記しました。»プロフィールid:uzullauzullaがブログです。参加してきました!月別アーカイブ参加グループWindows開発者はてなブログをはじめよう!uzullaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。