2010-09-07 56 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