문제

Perl 모듈을 작성하고 있으며 잉어를 사용하여 치명적이지 않은 경고를 호출 프로그램에 돌려줍니다.

잉어 경고는 제대로 작동합니다 - 입력 매개 변수가 특정 조건을 충족하는지 확인하고 있습니다. 조건을 충족하지 않으면 잉어와 함께 경고가 전송되고 모듈은 호출 프로그램 대신 매개 변수의 기본값을 사용하여 계속됩니다. 통과. 경고는 전달 된 매개 변수 대신 기본 매개 변수를 사용하고 있음을 알리는 것입니다.

내 문제는 내 테스트 스크립트입니다. 내 테스트 스크립트가 모듈에 잘못된 매개 변수를 보내고 있으며, 돌아 오는 경고 메시지를 찾아 올바른 경고 메시지를 받았는지 확인하려고합니다.

내 모듈은 다음과 같습니다.

else {
  carp "value must be numeric - using default value";
}

그리고 내 테스트 스크립트는 다음과 같습니다.

eval {
  #call to my module
};
like (
    $@,
    qr/value must be numeric/,
    "Should abort on non-numeric value"
);

테스트를 실행하면 화면에서 경고 (stderr로 가야 함)를 볼 수 있지만 $@ 변수의 내용은 '' - blank입니다.

내 테스트 스크립트의 출력은 다음과 같습니다.

t/04bad_method_calls....ok 10/12value must be numeric - using default value at ...
#   Failed test 'Should abort on non-numeric value'
#   at t/04bad_method_calls.t line 98.
t/04bad_method_calls....NOK 12
#                   '' doesn't match '(?-xism:value must be numeric)'
# Looks like you failed 1 test of 12.

잉어를 크로크로 바꾸면 테스트 스크립트가 작동합니다. 오류 메시지를 포착합니다 (그러나 중단하지 않고 경고하고 싶습니다).

솔직히 말해서, 나는 Eval에 대한 최선의 이해가 없습니다. 아마도 잉어에서 경고 출력을 잡는 가장 좋은 방법은 아닙니다. 나는 $ sig {를 사용해 보았다.경고하다} 그러나 그것은 또한 비어있었습니다.

잉어에서 출력을 캡처하는 방법이 있습니까? 테스트 스크립트에 있기 때문에 가장 큰 거래는 아니지만 테스트 스크립트가 제대로 작동하도록하고 싶습니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

이 페이지에서 http://perldoc.perl.org/perlvar.html, 그것은 당신이 로컬을 설정하고 싶은 것 같습니다. $SIG{__WARN__} 테스트 스크립트의 치명적인 오류로 경고를 바꿀 서브 루틴에. 그들이주는 예는 다음과 같습니다.

local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;

다른 팁

또 다른 방법은 경고와 모든 것을 잡는 방법 STERR 산출:

my $stderr = '';
{
    local *STDERR;
    open STDERR, '>', \$stderr;
    do_stuf_here();
}
like( $stderr, qr/my result/, 'test stderr output' );

멋진 테스트 기능을 만들 수 있습니다.

sub stderr_test (&$$) {
    my ( $code, $pattern, $text ) = @_;
    my $result = '';
    {
        local *STDERR;
        open STDERR, '>', \$result;
        $code->();
    }
    if ( UNIVERSAL::isa( $pattern, 'Regexp' ) ) {
        like( $result, $pattern, $text );
    }
    else {
        is( $result, $pattern, $text );
    }
}

# usage
stderr_test {do_stuf_here} qr/my expected STDERR output/,
    'stderr is like';
stderr_test {do_stuf_here} 'my expected STDERR output',
    'stderr is exactly';

테스트 스크립트 에서이 작업을 수행하는 경우 테스트 ::* 출력을 캡처하는 모듈을 사용할 수 있습니다. 나는 좋아하는 경향이있다 테스트 :: 출력.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top