cakephp1.2のテストでControllerをテストする際はtestActionが便利なんだけど、redirect()やcakeError()を含むアクションの場合、いろいろ面倒。
というか、おかしくなる。
途中で本当にリダイレクトされたり強制終了させられたりしてしまい、テストが終ってしまう。
本家でなんとかして・・・。
とりあえずこちらで出来る対策を探してみたんだけど、あんまり情報ないんだよね。
みんなテストして無いの?
ってことで、以下のサイトを参考にして対応。
[cakephp]testActionでredirectするアクションをテストする方法 | Ryuzee.com
PHP拡張であるrunkitを利用して、メソッド自体を書き換えてしまえば良いということなんだけど、これが一番妥当なのかも。
僕の場合は、こんな感じでテストケースに書いちゃう。
これも、CakeTestCaseを継承した独自グラスを作成して、そこに埋め込んじゃえば良いんだろうけど、今回はそこまで大きな案件でも無いので。
あと、処理を見てもらえれば分かると思うんだけど、テスト用にViewも用意したよ。
■エラー用
■リダイレクト用
ま、これで一応処理が途中で止まることもなくなるし、debug()で内容見たかったら見れるしって感じにはなった。
これらのviewはあくまでテスト用なので、app/tests/にviewsってディレクトリ作って、そこにぶち込んだ。
普通そのディレクトリはリリースしないだろうしね。
こういう情報ほとんどないんだけど、みんなテストは独自の方法でやっているのかなー。
むー。
知りたい。
というか、おかしくなる。
途中で本当にリダイレクトされたり強制終了させられたりしてしまい、テストが終ってしまう。
本家でなんとかして・・・。
とりあえずこちらで出来る対策を探してみたんだけど、あんまり情報ないんだよね。
みんなテストして無いの?
ってことで、以下のサイトを参考にして対応。
[cakephp]testActionでredirectするアクションをテストする方法 | Ryuzee.com
PHP拡張であるrunkitを利用して、メソッド自体を書き換えてしまえば良いということなんだけど、これが一番妥当なのかも。
僕の場合は、こんな感じでテストケースに書いちゃう。
# HogeControllerTestクラス
function startCase() {
runkit_method_redefine(
'RequestsController',
'redirect',
'$url, $status = null, $exit = true',
'$this->set(\'function\', \'redirect\');'.
'$this->set(\'url\', $url);'.
'$this->set(\'status\', $status);'.
'$this->set(\'exit\', $exit);'.
'$this->render(null, null, TESTS . DS . \'views\' . DS . \'redirect.ctp\');'
);
runkit_method_redefine(
'RequestsController',
'cakeError',
'$method, $messages = array()',
'$this->set(\'function\', \'cakeError\');'.
'$this->set(\'method\', $method);'.
'$this->set(\'messages\', $messages);'.
'$this->render(null, null, TESTS . DS . \'views\' . DS . \'error.ctp\');'
);
}これも、CakeTestCaseを継承した独自グラスを作成して、そこに埋め込んじゃえば良いんだろうけど、今回はそこまで大きな案件でも無いので。
あと、処理を見てもらえれば分かると思うんだけど、テスト用にViewも用意したよ。
■エラー用
# app/tests/views/error.ctp
<h2>cakeError</h2>
<div>method : <?php echo $method ? $method : ''; ?></div>
<?php foreach ($messages as $k => $v) : ?>
<div>messages : <?php echo '[', $k, '] : ', $v; ?></div>
<?php endforeach; ?>■リダイレクト用
# app/tests/views/redirect.ctp
<h2>redirect</h2>
<div>session flash : <?php $session->flash(); ?>
<?php if (isset($url) &&is_array($url)) : ?>
<?php foreach ($url as $k => $v) : ?>
<div>url : <?php echo '[', $k, '] : ', $v; ?></div>
<?php endforeach; ?>
<?php else: ?>
<div>url : <?php echo $url ? $url : ''; ?></div>
<?php endif; ?>
<div>status : <?php echo $status ? $status : ''; ?></div>
<div>exit : <?php echo $exit ? $exit : ''; ?></div>ま、これで一応処理が途中で止まることもなくなるし、debug()で内容見たかったら見れるしって感じにはなった。
これらのviewはあくまでテスト用なので、app/tests/にviewsってディレクトリ作って、そこにぶち込んだ。
普通そのディレクトリはリリースしないだろうしね。
こういう情報ほとんどないんだけど、みんなテストは独自の方法でやっているのかなー。
むー。
知りたい。
コメント