2012-05-10 2 views
0

Есть ли у Test :: More какой-то механизм для запуска блока кода перед каждым подтестом? Я нахожу, что я пишу одинаковые аранжировки на каждом тесте, и я хотел бы облегчить себе жизнь, поставив его в блок или что-то еще? Я посмотрел на perldocs, но я не видел ничего специально построенного для этого?Perl Test :: More Before Block

+0

Не считается ли это важной частью испытаний, чтобы иметь полностью независимые устройства? Так или иначе. Вы всегда можете использовать функции, которые обертывают ваши тестовые значения и передают их в качестве параметров функции 'Test :: More'. –

+0

Возможно, вы можете использовать 'subtest'. – JRFerguson

+0

Перед тем, как блок, к которому я привык, является excecute перед каждым тестом, поэтому он полностью независим. В качестве временного решения я создал функцию, называемую arr(), которая делает это для меня. Тем не менее, я пытался использовать структуру. –

ответ

6

Довольно легко сделать самостоятельно:

use Hook::LexWrap qw(wrap); 

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

Hook::LexWrap

1

Test::More «s тесты, как запустить 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(@_); 
} 

Таким образом, вы можете просто нажать, в реализации builder для Test::More, так как он вызывает один в его родительский класс:

{ package Test::More; 
    sub builder { 
     &stuff_I_want_to_do; 
     my $inv = shift; 
     return $inv->SUPER::builder(@_); 
     # OR return Test::Builder->new; 
    } 
} 
Смежные вопросы