2012-05-10 44 views
0

Test :: More有一些機制在每個子測試之前運行一段代碼?我發現自己在每次測試中都寫了相同的安排,並且我想通過將它放在塊之前或之前讓我的生活更輕鬆?我看着perldocs,但沒有看到爲此專門設計的任何東西?Perl測試::更多之前

+0

是否它被認爲是具有完全獨立單元的測試的重要組成部分?無論如何。你總是可以使用封裝你的測試值的函數,並將它們作爲參數傳遞給'Test :: More's函數。 –

+0

也許你可以利用'subtest'。 – JRFerguson

+0

我之前習慣的塊在每次單獨測試之前都會超時,所以它是完全獨立的。作爲一個臨時解決方案,我創建了一個名爲arrange()的函數,它爲我做了這個。不過,我試圖利用這個框架。 –

回答

6

比較容易做自己:

use Hook::LexWrap qw(wrap); 

wrap $_, pre => sub { ... } 
    for qw(is ok ...); 

Hook::LexWrap

1

Test::More的測試似乎每次測試之前運行Test::Builder::Module::builder。你可以用這個替換這個實現。

{ package Test::Builder::Module; 
    my $old_imp = \&Test::Builder::Module:builder; 
    no warnings 'redefine'; 
    sub builder { 
     Mypackage::setup_test(); 
     goto &$old_imp; 
    } 
} 

如果這似乎太危險了,它實際上調用它像這樣:

sub is ($$;$) { 
    my $tb = Test::More->builder; 

    return $tb->is_eq(@_); 
} 

所以,你可以只推入了Test::Morebuilder的實現,因爲它調用一個在其父類:

{ package Test::More; 
    sub builder { 
     &stuff_I_want_to_do; 
     my $inv = shift; 
     return $inv->SUPER::builder(@_); 
     # OR return Test::Builder->new; 
    } 
}