2015-02-06 2 views
2

: 내가 가진이 (펄)에 '출구'가 서브 루틴을 테스트하는 방법 예를 들어

package Dummy::Mod; 

use warnings; 
use strict; 

sub print_and_exit { 
    print "Hello World\n"; 
    exit; 
} 
1; 

그런

use warnings; 
use strict; 

use Test::More; 
use Test::Output; 

plan tests => 2; 
ok(require('dummy_mod.pl'), 'load test') or exit; 
stdout_is(sub { Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test"); 

dummy_mod.t

dummy_mod.pl :

$ perl dummy_mod.t 
1..2 
ok 1 - load test 
# Looks like you planned 2 tests but ran 1. 

테스트 스크립트가 종료되는 것 같습니다. 시험 # 2가 끝나기 전에. 'exit'을 print_and_exit 서브 루틴에서 제거하면 작동하지만 실제로 실행하고 싶지는 않습니다. 나는 다음과 같이 시도했다 :

stdout_is(sub { local $SIG{INT} = sub {}; Dummy::Mod->print_and_exit() }, "Hello World\n", "stdout test"); 

그것은 작동하지 않는다.

편집 : 주 목적은 해당 서브 루틴의 출력을 테스트하는 것입니다. 실제로는이 서브 루틴의 종료 코드는별로 신경 쓰지 않습니다.

답변

3

Test::Trap을 사용할 수 있습니다. 여기에 문서의 개요의 예는 다음과 같습니다 Test::Trap는 트랩 출구 이상을 수행

use Test::More; 
use Test::Trap; 

my @r = trap { some_code(@some_parameters) }; 
is ($trap->exit, 1, 'Expecting &some_code to exit with 1'); 
is ($trap->stdout, '', 'Expecting no STDOUT'); 

하는 것으로, 이 파일을 사용하여 STDOUT, STDERR, 경고 등을 테스트 할 수도 있습니다.

+0

감사합니다. 작동합니다 : is ($ trap-> stdout, "Hello World \ n", 'stdout test'); – vts