perl - 在 Perl 中写入文件时测试错误处理的最简单方法是什么?

标签 perl testing integration-testing die

我有一个糟糕的标准 Perl 文件编写代码(希望)有足够的错误处理,类型:

open(my $fh, ">", "$filename") or die "Could not open file $filname for writing: $!\n";
# Some code to get data to write
print $fh $data  or die "Could not write to file $filname: $!\n";
close $fh  or die "Could not close file $filname afterwriting: $!\n";
# No I can't use File::Slurp, sorry.

(我只是凭内存写了这段代码,请原谅任何错别字或错误)

在第一个“die”行测试错误处理有点容易(例如,创建一个与您计划写入的名称相同的不可写文件)。

如何测试第二(打印)和第三(关闭)“die”行中的错误处理?

我知道在关闭时引发错误的唯一方法是在写入时用完文件系统上的空间,这作为测试并不容易。

我更喜欢集成测试类型的解决方案而不是单元测试类型(这将涉及在 Perl 中模拟 IO 方法)。

最佳答案

使用错误的文件句柄会使它们都失败

use warnings;
use strict;
use feature 'say';

my $file = shift || die "Usage: $0 out-filename\n";

open my $fh, '>', $file  or die "Can't open $file: $!";

$fh = \*10;

say $fh 'writes ok, ', scalar(localtime)  or warn "Can't write: $!";

close $fh or warn "Error closing: $!";

打印

say() on unopened filehandle 10 at ...
Can't write: Bad file descriptor at ...
close() on unopened filehandle 10 at ...
Error closing: Bad file descriptor at ...

如果您不想看到 perl 的警告,请使用 $SIG{__WARN__} 捕获它们并将您的消息打印到文件(或 STDOUT),例如。

关于perl - 在 Perl 中写入文件时测试错误处理的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55927880/

相关文章:

testing - 如何在 Nodeunit 中添加自定义断言

java - 即使在排除单元测试之后,单元测试也会在集成测试阶段执行

perl - 如何让所有继承的方法返回子类对象?

java - 内联::java 和草莓 Perl

Perl 类关闭

testing - 获取运行 Protractor 的 Web 驱动程序日志信息

ruby-on-rails - 使用 RSpec 2 测试 Rails 3.1 引擎路由

perl - 在语料库中标记单词

grails - 如何在 IntelliJ IDEA 中进行 Grails 3 集成测试

java - 如何测试@Cacheable?