测试::更多不知道测试是否死亡 - 所以我该如何测试?

时间:2010-08-26 21:53:46

标签: perl testing module

我正在收集一堆子程序,这些子程序对于我的一堆脚本来说是常见的。 (我应该早点这样做,但是从继承的脚本开始。)我正在使用Test :: More和Module在非常有用的示例here上建模我的工作: :体形

所有从文件读取或写入的子例程都包含一行open() or die "errmsg"。我正在为模块编写测试并遇到了这个问题。其中一个子程序检查路径是否指向某个东西,在失败时死亡。在继承的脚本中,子例程如下所示:

sub checkExist {
  my ($type, $path) = @_;
  if ($type eq 'd') {
    if (! -d $path) {
      warn("dir not found: $path\n");
      die $pathNotFound;
    }
  }
  elsif ($type eq 'f') {
    if (! -f $path) {
      warn("file not found: $path\n");
      die $pathNotFound;
    }
    elsif (! -s $path) {
      warn("empty file: $path\n");
      die $emptyFile;
    }
  }
}

现在,我正在使用以下行进行测试:

is(HomeBrew::IO::checkExist('f', $0), '', "can checkExist find file $0 ?");

除非我选择一个不存在的路径,否则测试脚本会死,但测试成功,会产生以下输出:

# Looks like your test exited with 2 just after 5.
Dubious, test returned 2 (wstat 512, 0x200)
All 5 subtests passed 

我更喜欢这是一个失败的测试(而不是一个可疑的传递),但由于这是遗留代码,我还希望这个子例程在失败时停止执行。该怎么办?在函数上编写测试这么简单是愚蠢的吗?

我已经编写了一个checkExist2函数,我将来会在成功时返回undef,否则会返回非零错误(所以我可以在别处写die if checkExist2())。其他建议不支持checkExist的功能。

2 个答案:

答案 0 :(得分:16)

使用Test::Exception测试代码是否存在,或者是否存在正确错误的正确方法。您可以围绕其他测试用例包装此测试,因为它只需要一个coderef:

use Test::More;
use Test::Exception;

lives_ok {
    is(HomeBrew::IO::checkExist('f', $0), '',
    "can checkExist find file $0 ?")
} '...and code does not die';

答案 1 :(得分:2)

为什么不在测试模块中有一个辅助子程序,它绕eval{} HomeBrew::IO::checkExist调用$@并通过sub runcheckExist { my $res = eval { HomeBrew::IO::checkExist('f', $0) }; # May want more logic here # for checking $@ for specific error text pattern # or $res return $@ ? 1 : 0; } my $expect_to_die = 1; is(runcheckExist(), $expect_to_die, "can checkExist find file $0 ?"); 检查失败?

{{1}}