Какой самый простой способ проверить обработку ошибок при записи в файл в Perl? - PullRequest
3 голосов
/ 30 апреля 2019

У меня есть стандартный код написания 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).

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

Работа с неверным дескриптором файла приведет к сбою их обоих

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), например.

0 голосов
/ 01 мая 2019

Проверка ответа zdim ...

Запись в дескриптор файла, открытый для чтения.

Закрытие дескриптора файла, который уже был закрыт.

...