Почему не докажут, что -MCarp = verbose? - PullRequest
4 голосов
/ 31 августа 2010

Я запустил этот тестовый скрипт:

use strict;
use warnings;
use Test::More tests => 3;
use Carp;

ok(1<2);
pass();
fail();
croak "example";

с помощью командной строки prove -MCarp=verbose -v foo.pl и получил следующие ошибки:

Subroutine App::Prove::verbose redefined at /opt/ActivePerl-5.12/lib/App/Prove.pm line 407
        App::Prove::_load_extension('App::Prove=HASH(0x683718)', 'Carp=verbose') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 419
        App::Prove::_load_extensions('App::Prove=HASH(0x683718)', 'ARRAY(0x683850)') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 481
        App::Prove::run('App::Prove=HASH(0x683718)') called at /opt/ActivePerl-5.12/bin/prove line 11
Undefined subroutine &Carp::verbose called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 484.

Если я запускаю его с помощью perl -MCarp=verbose foo.pl, проблем нет. Что заставляет prove отказаться от многословного карпа? Как я могу получить полный стек вызовов из моих тестов, когда они croak без глобальной замены croak на confess?

Ответы [ 3 ]

10 голосов
/ 31 августа 2010

prove -M не похоже на perl -M. Похоже, что вы загружаете проверочное расширение, а не загружаете модуль в свои тесты. Документы на этот счет совершенно неясны, но код в App :: Prove - нет. Поэтому prove -MCarp=verbose импортирует Carp :: verbose в App :: Prove, вызывая проблему выше.

Простой способ сделать то, что вы хотите, это использовать переменную среды PERL5OPT плюс Carp :: Always , которая превратит все предупреждения и умирает (и карпы и каркает) в следы стека.

PERL5OPT=-MCarp::Always prove ...

Это дает дополнительное преимущество работы в любой ситуации, с доказательством или без него.

3 голосов
/ 31 августа 2010

proof имеет совершенно другой набор аргументов командной строки, чем perl, будучи совершенно другой программой?

Доказательство -M, как мне кажется, предназначено для включения прагм;На самом деле Carp экспортирует прямую ссылку на подпрограмму verbose (), которая мешает внутренней работе proof.

Вы можете создать небольшой модуль, подобный этому:

# Verbme.pm
use Carp;
$Carp::Verbose = 1;

, и включить его из proof:

prove -MVerbme -v foo.pl

хотя.

2 голосов
/ 31 августа 2010

Карп использует механизм экспортера EXPORT_FAIL для обработки verbose "опции" для import, что в значительной степени неправильно, так как Exporter::Heavy все равно будет пытаться присвоить *Carp::verbose для *{"$callerpkg::verbose"}, несмотря на то, чтоэто было "не удалось".К сожалению, у App::Prove есть подробный саб, от которого зависит работа, и ваш параметр -M заставляет импорт происходить в пределах App::Prove.Я не уверен, кто здесь виноват - Carp за (ab), используя EXPORT_FAIL таким образом, или Exporter::Heavy за то, что он не удаляет вещи из @imports, если они есть в списке @failed, но вместеони ломают его:)

...