'-e $file' zwecks Test überladen?

23/10/2008 - 22:56 von Helmut Wollmersdorfer | Report spam
Hi,

zwecks automatischem Test eines Moduls

package MyModule;

sub get_foo {
my $file = '/etc/foo.conf';

if (-e $file) {
open my $fh,'<',$file;
my $content = <$fh>;
return $content;
}
}

will ich verschiedene File-Inhalte per t-script einfüttern, ohne einen
richtigen File zu verwenden.

Hier mein - nicht ganz funktionierender - Ansatz:

get_foo.t ==#!perl -T

use strict;
use warnings;

my %file;

use overload
'-e' => sub {
my ($name) = @_;
print 'trying mocked -e',"";
return exists $file{$name};
};


my $filename = '/etc/foo.conf';
my $filecontent = 'test';

BEGIN {

package MyModule;
use subs qw(open);

package main;

no strict 'refs';
*{'MyModule::open'}
= sub {
print 'trying mocked open',"";
return open $_[0], $_[1], \$file{$_[2]};
};
}

use Test::More qw(no_plan);

$file{foo} = 1;
ok(-e 'foo', 'file foo exists'); # funktioniert nicht

use MyModule qw(get_foo);

can_ok('MyModule', 'open');

ok(get_foo() eq 'test','get_foo() eq test'); # [1]

__END__


[1] funktioniert, wenn ich in MyModule::get_foo() das '-e' weglasse.

Wie könnte es funktionieren? Oder gibt es irgendwo sowas wie
Test::MockFileInfo als CPAN-Module?

TIA

Helmut Wollmersdorfer
 

Lesen sie die antworten

#1 Slaven Rezic
24/10/2008 - 09:28 | Warnen spam
Helmut Wollmersdorfer writes:

Hi,

zwecks automatischem Test eines Moduls

package MyModule;

sub get_foo {
my $file = '/etc/foo.conf';

if (-e $file) {
open my $fh,'<',$file;
my $content = <$fh>;
return $content;
}
}

will ich verschiedene File-Inhalte per t-script einfüttern, ohne einen
richtigen File zu verwenden.

Hier mein - nicht ganz funktionierender - Ansatz:



[...]

Wie könnte es funktionieren? Oder gibt es irgendwo sowas wie
Test::MockFileInfo als CPAN-Module?




Unter Unix, und wenn das Testskript als Superuser làuft, könnte man
vielleicht etwas mit chroot() stricken.

Gruß,
Slaven

Slaven Rezic - slaven <at> rezic <dot> de
Tired of using file selectors? Real programmers use the TAB key for
completion and not for jumping around. Try
http://search.cpan.org/search?mode=...p;query=Tk::PathEntry

Ähnliche fragen