@kyanny's blog

My life. Opinions are my own.

RewriteMap のテストはどう書けばよいのだろう

mod_rewrite で使う RewriteMap も、複雑になってきたときのことを考えて正しいリライトができるようにテストを書こうとしたのですが、うまくいきませんでした。

#!/usr/local/bin/perl
$| = 1;
while (<>) {
    # do something
    print;
}

これを、

use Test::Base qw(no_plan);

do "rewrite.pl" # ダメ
require "rewrite.pl" # ダメ

my $code = io("rewrite.pl");
eval $code; # テストスクリプトが止まってしまってダメ
eval $code->("/foo/bar/baz"); # "#!/usr/local/bin/perl ..." という文字列をサブルーチンリファレンスとして呼ぶことはできないよんと怒られてダメ
`$code`; # #!/usr/local/bin/perl ... をシェルスクリプトとして一行ずつシェルで実行し始めてダメ

__END__
===
--- input chomp
/foo/bar/baz
--- expected chomp
/foo/baz/?key=bar

こんな風に試してみたけど、 do とか eval をすると while (<>) {} が実行されて無限ループに入るのでテストが止まってしまい、ダメでした。ダイヤモンド演算子は標準入力か、なければコマンドライン引数を見ると書いてあったのだけど、どちらもうまく与えることができません。

RewriteRule の書き方にもよるので、 RewriteMap のテストがかけてもそんなにうまみはないのかもしれません。