2017-02-06 2 views
1

У меня есть следующая подпрограмма, которая создает базу данных:ошибки тестирования с Test :: Предупреждать выброшена петлей

sub create_db { 
    my $self = shift; 
    my $name = shift; 
    $self->dbh->do("create database $name") 
} 

Эту подпрограмма вызывается этим, который генерирует несколько баз данных в цикле:

sub add_all_databases { 
    my $self = shift; 

    foreach my $year (@{$self->years}) { 
    my $name = DB_NAME_PREFIX . $year; 
    $self->create_db($name); 
    } 
} 

Perl генерирует предупреждение, если база данных уже существует:

DBD::mysql::db do failed: Can't create database 'db_2014'; database exists 

Я хочу, чтобы создать тест, чтобы проверить, что т Если предупреждение о том, что база данных уже существует, выдается предупреждение. Я попытался с этим тестом:

use Test::Warn 

warnings_like {$i->add_all_databases} qr{do failed}, 'throws error if database exists'; 

Однако, похоже, что это не сработало. Я получаю такой вывод из моего тестового сценария:

not ok 17 - throws error if database exists 
# Failed test 'throws error if database exists' 
# at ./importer.t line 69. 
# found warning: DBD::mysql::db do failed: Can't create database 'db_2000'; database exists at /home/steve/perl/perl-lib/DB.pm line 46, <DATA> line 1. 
# found warning: DBD::mysql::db do failed: Can't create database 'db_2001'; database exists at /home/steve/perl/perl-lib/DB.pm line 46, <DATA> line 1. 
# found warning: DBD::mysql::db do failed: Can't create database 'db_2002'; database exists at /home/steve/perl/perl-lib/DB.pm line 46, <DATA> line 1. 
# expected to find warning: (?^:do failed) 

Как правильно написать тест, который пройдет?

+0

ОК, теперь я вижу, что если я пытаюсь создать 3 базы данных, мне нужно иметь 'qr {do failed}' в ссылке массива 3 раза. Думаю, мне нужно предвидеть, сколько баз данных будет создано в моем тесте, если не будет лучшего способа. – StevieD

ответ

4

Второй аргумент warnings_like должен быть ссылкой на массив, содержащий ровно столько элементов, сколько есть предупреждения:

warnings_like { warn $_ for 1..3 } [qr/1/, qr/\d/, qr/[345]/]; 

Как и в сторону, создавая несколько баз данных с разными числовыми суффиксами является одним из основных кодов запах. Как правило, было бы лучше иметь единую базу данных с колонкой за год.

+0

ОК, поэтому я пытаюсь создать 18 баз данных (да, я согласен, возможно, не очень хорошая идея). Поэтому я получил это 'warnings_like {$ i-> add_all_databases} [qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr { qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr {do failed}, qr { do failed}, qr {do failed}, qr {do failed}, qr {do failed}], 'выдает ошибку, если база данных существует'; ' Тест проходит, но это очень уродливо. Каков наилучший способ переписать это? – StevieD

+2

@StevieD используйте оператор 'x'. 'warnings_like {...} [(qr {foo}) x 18]' – simbabque

+1

@StevieD 'my @warnings; push @warnings, qr/foo/for 1..18; warnings_like {...} \ @warnings; 'или' my @warnings = map qr/foo /, 1..18; ' – ThisSuitIsBlackNot

Смежные вопросы