2010-09-07 55 views
2

随着Test::More我经常想要一个模块,运行测试,并有能力中止呼叫者test_plan。我有一系列测试,为Catalyst::Test设置了一个插件列表。我不想做我的测试检查,看看它们是否存在;相反,如果这些插件不存在,我希望我的脚本中止。Perl测试::更多和设置测试要求

我试图追踪我的Catalyst::Authentication::Store::DBI::ButMaintained中的一个错误,并且我注意到这个错误也出现在Catalyst::Authentication::Store::DBI中。那就是:

eval { 
    require Catalyst::Model::DBI; 
    require Catalyst::Plugin::Session; 
    require Catalyst::Plugin::Session::State::Cookie; 
    require Catalyst::Plugin::Session::Store::File; 
    require DBD::SQLite; 
    require Test::WWW::Mechanize::Catalyst; 
} or plan skip_all => [email protected]; 

... 

$ENV{'TESTAPP_PLUGINS'} = [ qw(
    Authentication 
    Session 
    Session::Store::File 
    Session::State::Cookie 
    Authorization::Roles 
) ]; 

正如你所看到的,eval/skip_all不检查Authorization::Roles包容,但测试由于它是一个插件的依赖于它。

我还有另一个问题 - 是否有一个更优雅的方式来指定测试依赖项比这个?请记住,我的目标与原作者相同。如果测试要求不存在,我只想跳过测试。理想情况下,在这种情况下,我想破解Catalyst::Test来封装Catalyst::Plugin::*东西的插件机制,然后找到一个更好的方法来完成剩下的东西,而不是eval/skip_all

回答

1

可以动态调用影响的计划中的测试#:

Test::More->builder->plan(tests=>$total_tests); 

您可以使用那些有条件计算基础上,需求测试#。

+0

这很有趣,我现在就玩,谢谢你提供的信息。 – 2010-09-07 18:42:26

+0

如果我可能会问,为什么downvote? – DVK 2010-09-07 19:28:41

+4

无需卡车'Test :: More-> builder','使用Test :: More;计划(测试=> $ num)'工作正常。 – Schwern 2010-09-07 20:04:44

1

更新你的插件列表中根据需要:

如果你是在一个单独的封装测试一堆的要求,你可以简单地有包返回false(而不是传统的真值),如果依赖性得不到满足:

package Catalyst::Test; 

eval { 
    use Dep1; 
    use Dep2; 
    # ... 
} 

# dep check package returns true if we found all the modules 
[email protected]; 

# test.pl 
use Test::Requires { 
    Catalyst::Test => 0.01, # skip all tests if Catalyst::Test is not present 
}; 
use Test::More tests => 20; # call Test::More as normal. 

当我运行这个使用一种称为Foo DEP检查,这将失败,并适当的输出:

 
% perl -I. foo.t 
1..0 # SKIP Foo.pm did not return a true value at (eval 4) line 2. 
# BEGIN failed--compilation aborted at (eval 4) line 2. 
# 
 
% prove -I. foo.t 
foo.pl .. skipped: Foo.pm did not return a true value at (eval 4) line 2. 
Files=1, Tests=0, 0 wallclock secs (0.02 usr 0.01 sys + 0.01 cusr 0.00 csys = 0.04 CPU) 
Result: NOTESTS 
+0

我不会反对在我的测试脚本中存在这个问题。但是,'Catalyst :: Test'仍应该测试它自己的插件列表,如果这些插件不存在,脚本应该跳过。 – 2010-09-07 19:27:07

+0

@Evan:更新; Test :: Requires中引用的模块如果对环境不满意,可以简单地返回false。 – Ether 2010-09-07 19:34:24

+0

再一次,我不确定返回非真是我希望我的脚本跳过的原因,我宁愿他们更加冗长。我希望Catalyst Plugins理想地导致调用测试跳过,如果它们没有安装 - 这应该是Catalyst :: Test' imho的核心功能,我有兴趣修补它。我正在寻找的其余部分似乎已经出现在'Test :: Requires'中。 – 2010-09-07 19:38:47