2

我经常希望有Test::More一个运行测试并能够中止调用者的模块test_plan。我有一系列测试为Catalyst::Test. 我不想让我的测试检查它们是否存在;相反,如果这些插件不存在,我希望我的脚本中止。

我试图找出我的一个错误,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 => $@;

...

$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.

4

2 回答 2

1

您可以通过调用来动态影响计划中的测试数量:

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

您可以使用它根据需要有条件地计算测试数量。

于 2010-09-07T18:38:20.047 回答
1

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

如果你在一个单独的包中测试一堆需求,你可以简单地让那个包返回 false(而不是传统的 true 值)如果不满足依赖关系:

package Catalyst::Test;

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

# dep check package returns true if we found all the modules
!$@;

# 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.

当我使用名为 的 dep 检查器运行它时Foo,它会失败并显示适当的输出:

% perl -I。脚
1..0 # SKIP Foo.pm 在 (eval 4) 第 2 行没有返回真值。
# BEGIN failed--编译在 (eval 4) 第 2 行中止。
#
%证明-I。脚
foo.pl .. 跳过:Foo.pm 在 (eval 4) 第 2 行没有返回真值。
文件=1,测试=0,0 挂钟秒(0.02 usr 0.01 sys + 0.01 cusr 0.00 csys = 0.04 CPU)
结果:注释
于 2010-09-07T19:16:13.923 回答