2015.11.27
0からはじめるPHP#59【TDDで作り直す掲示板#7-データベースのテスト-】
やっと生活リズムを元に戻せたので、作業の方を進めたいなと。
掲示板の基本的な機能は前回の時点で出来上がったので、それをテストして検査する段階に入ってみようかと思います。といっても掲示板ごときに検査とかそんな必要なぐらい煩雑な手続きとかないんですけどね・・・・・・。
ただ、これまでに申し上げた通り、一口にテストをするといっても色々問題が発生します。
まず
phpunitは$_SERVER['REMOTE_ADDR']が定義されていないという問題を解決する必要があります。
なんでなんでしょうね。ただ、ネットワークに関することなのでテストしきれないとか、そもそも不要だと思って実装されていないんでしょうか。
こればっかりは仕方がないので、手動で定義する必要があります。ソースの方で$_SERVER['REMOTE_ADDR']に
127.0.0.1を入れてやらなければなりません。
次に、データベースの問題です。
テストの中に、データベースにデータを送信するものは絶対に入るはずなのですが、同じデータをテストの度に格納すると、同じデータが大量に蔓延してしまい邪魔ですし、消すのもそれはそれで面倒です。だからといって毎回データを変えるのもやはり面倒ですし、難しいです。
データベースに値が格納できるかどうか確かめるかつ
テストの前後でデータベースの内容が変わらないことを両立させるにはどうしたら良いのでしょう。
これは簡単です。クラスに
use DatabaseTransactions;を追記すれば良いだけです。
まじでこれだけで全て解決します。やってることはデータベーストランザクション・・・・・・とのことで、たぶん実行が終わったら強制的にロールバックを発生させるような仕組みなんでしょう。中身は良くわかりませんが今は知る必要はないかなと思います。
これで普通は上手く動くのですが、最後に一つ残った問題が。
どうもphpでのテストは、サーバー側だけで解決できる問題にしか適用できない・・・・・・つまりMETAタグが効かないんですね。
これはどういうことを意味するかというと
#49で作った苦し紛れのコードが効かないということなんですね。
return redirect('./')
->withCookie(cookie()->forever(self::$names[0],$cookies[self::$names[0]]))
->withCookie(cookie()->forever(self::$names[1],$cookies[self::$names[1]]))
->withCookie(cookie()->forever(self::$names[2],$cookies[self::$names[2]]))
->withCookie(cookie()->forever(self::$names[3],$cookies[self::$names[3]]))
->withCookie(cookie()->forever(self::$names[4],$cookies[self::$names[4]]))
->withCookie(cookie()->forever(self::$names[5],$cookies[self::$names[5]]));
結局こうする他なさそうです・・・・・・。
僕はオプション大好き人間なので、こういうのは後から用意に追加できるよう、全部配列にして、foreachでつなげていくのが大好きなんですけどね・・・・・・。
・・・・・・と、思ってふと試してみたのが・・・・・・
$a=redirect('./')
->withCookie(cookie()->forever(self::$names[0],$cookies[self::$names[0]]))
->withCookie(cookie()->forever(self::$names[1],$cookies[self::$names[1]]))
->withCookie(cookie()->forever(self::$names[2],$cookies[self::$names[2]]))
->withCookie(cookie()->forever(self::$names[3],$cookies[self::$names[3]]))
->withCookie(cookie()->forever(self::$names[4],$cookies[self::$names[4]]))
->withCookie(cookie()->forever(self::$names[5],$cookies[self::$names[5]]));
return $a;
意味不明なんですが
何故かこれが動きます。
え、redirect()って関数なんだけど、それを代入って・・・・・・うん・・・・・・?
仮に参照だったとしても、それをreturnして何が起きるというんだ・・・・・・???
でも実際実行されている・・・・・・
ということは・・・・・・
$a=redirect('./');
foreach(self::$names as $name){
$a=$a->withCookie(cookie()->forever($name,$cookies[$name]));
}
return $a;
こうすることが可能で、きちんと実行されているようです。
ダンプしてexitで止めて中の構造を確認しようとするとなんか勝手に動き始めてしまうので、エスケープしなくてはいけませんね。
ただ、時間がないので今日はこの辺で。(笑)