Perl Test :: Дополнительная информация и настройка требований к тестированию - PullRequest
2 голосов
/ 07 сентября 2010

С Test::More Я часто хочу иметь модуль, который запускает тесты и имеет возможность прервать вызовы test_plan. У меня есть серия тестов, которые настраивают список плагинов для Catalyst::Test. Я не хочу делать свою контрольную проверку, чтобы видеть, существуют ли они; вместо этого я хочу, чтобы мой скрипт прерывал работу, если эти плагины отсутствуют.

Я пытался отследить ошибку в моем Catalyst::Authentication::Store::DBI::ButMaintained, и я заметил, что эта ошибка также присутствует в Catalyst::Authentication::Store::DBI. Вот оно:

eval {
  require Catalyst::Model::DBI;
  require Catalyst::Plugin::Session;
  require Catalyst::Plugin::Session::State::Cookie;
  require Catalyst::Plugin::Session::Store::File;
  require DBD::SQLite;
  require Test::WWW::Mechanize::Catalyst;
} or plan skip_all => $@;

...

$ENV{'TESTAPP_PLUGINS'} = [ qw(
  Authentication
  Session
  Session::Store::File
  Session::State::Cookie
  Authorization::Roles
) ];

Как видите, eval/skip_all не проверяет включение Authorization::Roles, но тест зависит от него в силу того, что он является плагином.

У меня есть еще один вопрос - есть ли более элегантный способ указать Test-зависимости, чем этот? Имейте в виду, моя цель такая же, как и у оригинальных авторов. Я просто хочу пропустить тест, если тестовые требования не существуют. В идеале, в этом случае я бы хотел взломать Catalyst::Test, чтобы обернуть механизм плагина для Catalyst::Plugin::*, а затем найти лучший способ сделать остальную часть этого без eval/skip_all.

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Обновите ваш список плагинов по мере необходимости:

Если вы тестируете набор требований в отдельном пакете, вы можете просто заставить этот пакет возвращать значение false (а не традиционное значение true), если зависимость не встречается:

package Catalyst::Test;

eval {
    use Dep1;
    use Dep2;
    # ...
}

# dep check package returns true if we found all the modules
!$@;

# test.pl
use Test::Requires {
    Catalyst::Test => 0.01,  # skip all tests if Catalyst::Test is not present
};
use Test::More tests => 20;  # call Test::More as normal.

Когда я запускаю это, используя средство проверки депозита, называемое Foo, это завершается неудачно с соответствующим выводом:

% perl -I. foo.t
1..0 # SKIP Foo.pm did not return a true value at (eval 4) line 2.
# BEGIN failed--compilation aborted at (eval 4) line 2.
#
% prove -I. foo.t
foo.pl .. skipped: Foo.pm did not return a true value at (eval 4) line 2.
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.01 cusr  0.00 csys =  0.04 CPU)
Result: NOTESTS
1 голос
/ 07 сентября 2010

Вы можете динамически влиять на количество тестов в плане, вызывая:

Test::More->builder->plan(tests=>$total_tests);

Вы можете использовать это условно рассчитать количество тестов на основе потребностей.

...