use_okがprove -lで実行すると通るのにperl -Ilibで実行すると通らなかった話

use Test::More;

use_ok 'Foo::Bar';

done_testing;

みたいなテストを実行するとき、まあ普通は prove -l する。1アサートごとの結果を見たい場合も prove -lv とかでいいんだけど、このときは忘れてて perl -Ilib で実行した。

上のようなテストだと通るんだけど、今回下のようなテストになってて通らなかった。

use File::Basename qw(dirname);
use Test::More;

chdir dirname __FILE__;

use_ok 'Foo::Bar';

done_testing;

こうして最低限のコードにするとわかりやすいんだけど、 'lib' の指し示す先が変わってしまうので通らないわけだ。

ただそうなると、なぜ prove -l では通るのか?

軽く App::Prove を読んでみると、 'lib'絶対パスにして処理していたのでそのせいで chdir の影響を受けなかったっぽい。

(当然 lib/Foo/Bar.pm は存在し、かつ use できる前提)

今日はたまたまそれほど解決にそれほど時間かからなかったからいいけど、勘でデバッグするのって駄目だよなあ。バグ見つけたらとにかく二分探索しつつ問題の最小化していかないと。そういう癖つけないと。