2017-02-06 1 views
1

I持ってデータベースを作成し、次のサブルーチン:テストエラーは::ループによってスロー警告する

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

このサブルーチンは、ループ内で複数のデータベースを生成し、この1によって呼び出されます。

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

OK、3つのデータベースを生成しようとすると、配列参照の中で 'qr {do failed}'を3回実行する必要があります。私は、より良い方法がない限り、私のテストで作成されるデータベースの数を予測する必要があると思います。 – StevieD

答えて

4

警告があるようwarnings_likeに2番目の引数が正確に同じ数の要素を含む配列への参照であるべきである。余談として

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

は、異なる数値サフィックスを持つ複数のデータベースを作成する主要なコードのにおいです。一般的に、その年の列を持つ単一のデータベースを持つ方がよいでしょう。

+0

OK、18個のデータベースを生成しようとしています(ええ、おそらく良い考えではないでしょう)。だから私はこの 'warnings_like {$ i-> add_all_databases} [qr {失敗しました}、qr {失敗}、qr {失敗}、qr {失敗}、qr {失敗}、qr {失敗} qr {失敗した}、qr {失敗した}、qr {失敗した}、qr {失敗した}、qr {失敗した}、qr {失敗した}、qr {失敗した} テストに合格しましたが、これは非常に醜いです。これを書き換える最善の方法は何ですか? – StevieD

+2

@StevieDは 'x'演算子を使います。 'warnings_like {...} [(qr {foo})x 18]' – simbabque

+1

@StevieD '私の@警告; 1.warings、qr/foo/1..18を押します。 warnings_like {...} \ @warnings; 'または' my @warnings = map qr/foo /、1..18; ' – ThisSuitIsBlackNot

関連する問題