Perl 使用循环引发的Test::Warn测试错误

Perl 使用循环引发的Test::Warn测试错误,perl,testing,Perl,Testing,我有以下创建数据库的子例程: 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 $na

我有以下创建数据库的子例程:

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)
如何正确编写将通过的测试?

类似警告的第二个参数应该是对数组的引用,该数组包含的元素数量与警告数量相同:

warnings_like { warn $_ for 1..3 } [qr/1/, qr/\d/, qr/[345]/];
另外,创建具有不同数字后缀的多个数据库是一个主要的代码气味。通常情况下,最好使用一个数据库,其中包含一列年度数据。

类似警告的第二个参数应该是一个数组的引用,该数组包含的元素与警告的数量完全相同:

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

另外,创建具有不同数字后缀的多个数据库是一个主要的代码气味。一般来说,最好有一个数据库,其中包含一个年度的列。

好的,我现在看到,如果我试图生成3个数据库,我需要在数组引用中使用qr{do failed}3次。我想我需要预测在我的测试中将创建多少个数据库,除非有更好的方法。好的,我现在看到,如果我试图生成3个数据库,我需要在数组引用中有3次qr{do failed}。我想我需要预测在我的测试中会创建多少个数据库,除非有更好的方法。好的,所以我尝试生成18个数据库是的,我同意,可能不是个好主意。所以我得到了这个警告。我得到了这个警告。我得到了这个警告。像{{{$I($I------------------{我------------------------------------[我{{做失败{{做失败{{{做失败{做失败{{{{倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒},qr{{{{{{{{{码码码码,学校学校学校校校校校校校校校校校校校校校校校校校校校校校际---------------{{{贵贵贵贵贵贵贵录录录录录录录录录录录录录录录录录录录录录录录录数据库存在';考试通过了,但这太难看了。重写这个的最好方法是什么?@StevieD使用x操作符。警告{…}[qr{foo}x18]@StevieD my@warnings;按@警告,qr/foo/1..18;警告{…}\@警告;或my@warnings=map qr/foo/,1..18;好的,我正在尝试生成18个数据库是的,我同意,可能不是个好主意。所以我得到了这个警告。我得到了这个警告。我得到了这个警告。像{{{$I($I------------------{我------------------------------------[我{{做失败{{做失败{{{做失败{做失败{{{{倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒},qr{{{{{{{{{码码码码,学校学校学校校校校校校校校校校校校校校校校校校校校校校校际---------------{{{贵贵贵贵贵贵贵录录录录录录录录录录录录录录录录录录录录录录录录数据库存在';考试通过了,但这太难看了。重写这个的最好方法是什么?@StevieD使用x操作符。警告{…}[qr{foo}x18]@StevieD my@warnings;按@警告,qr/foo/1..18;警告{…}\@警告;或my@warnings=map qr/foo/,1..18;