gpt4 book ai didi

perl - 使用循环抛出的 Test::Warn 测试错误

转载 作者:行者123 更新时间:2023-11-28 20:20:01 25 4
gpt4 key购买 nike

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

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 的第二个参数应该是对一个数组的引用,该数组包含的元素数量与警告数量完全相同:

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

顺便说一句,创建具有不同数字后缀的多个数据库是一种主要的代码味道。通常,拥有一个包含年份列的数据库会更好。

关于perl - 使用循环抛出的 Test::Warn 测试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42072262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com