<div class="gmail_quote"><div>Hallo, </div><div><br></div><div>Vielen Dank, erstmal für die Antworten. </div><div><br></div><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Da du deine Funktion read_from_file nennst, würde ich annehmen, dass du</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
lesen willst. Tatsächlich öffnest du aber zum schreiben. Ich würde dir</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
auch empfehlen, auf Bareword-Filehandle (OUT) zu verzichten. Damit</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
handelst du dir Probleme ein, die nicht sein müssen. Bspw. sind</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Bareword-Filehandle globale Variablen, du kannst sie also nicht in</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
rekursiven Funktionen einsetzen. Besser wären lexikalische Filehandle:</blockquote><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 open my $fh, "<", $filename or die</blockquote><div><br></div><div>Da hast du natürlich recht. Das mit dem zum schreiben öffnen war ein Tipp-Fehler und das mit dem Bareword wusste ich noch nicht.</div><div>Aber ich werds mir merken. </div>
<div>Die erste von dir aufgezeigte möglichkeit finde ich nicht so gut ich wollte ja den direkten Zugriff auf das Dateisystem vermeiden. </div><div>Der Vergleich mit einer bekannten, funktionierenden Funktion ist eine möglichkeit. </div>
<div><br></div><div>Ich hab fürs erste ein Filehandle übergeben und im Test das _DATA_ Filehandle genommen und dort raus gelesen.</div><blockquote class="gmail_quote" style="text-align:left;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 </blockquote><div><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex" class="gmail_quote">
Du kannst das File auch mit IO::File lesen.</blockquote><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex" class="gmail_quote">
Zum Testen tauschst Du dann das echte IO::File gegen ein gemocktes aus.</blockquote><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0,8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex" class="gmail_quote">
Entweder Du nimmst die Mock Module dafür oder Du schreibst ein IO::File selbst, speziell für diesen Test.</blockquote><div><br></div><div>Da muss ich mir mal die perldoc von IO::File angucken das hab ich noch nicht versucht. Aber das zu Mocken gefällt mir ganz gut. </div>
<div>Mal schauen ob ich das hinbekomme.</div><div><br></div><div>In weiterer Recherche bin ich auf die Module Test::Output und Test::Output::Tie gestoßen. </div><div>Test::Output ist kein Problem da kann ich was mit der Doku anfangen, ist halt leider nur für die Standard-Handles.</div>
<div>Test::Output::Tie ??? Keine Ahnung, wie soll ich das nutzten ? Kennt das jemand? </div><div>Habe das so verstanden das man damit auch andere Handles Testen kann. Aber wie?</div><div>Wäre um ein aussagekräftiges Beispiel sehr Dankbar.</div>
<div><br></div><div>Gruß,</div><div>Basti</div><div><br></div><div> </div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Message: 1<br>
Date: Sat, 31 Mar 2012 23:13:24 +0200<br>
From: Sebastian Oeste <<a href="mailto:oeste.sebastian@googlemail.com">oeste.sebastian@googlemail.com</a>><br>
To: <a href="mailto:dresden-pm@pm.org">dresden-pm@pm.org</a><br>
Subject: [Dresden-pm] Filehandles testen<br>
Message-ID:<br>
        <CAOcXQvs4cdC-epmYWSwJpokUkBTN57+HARyjTcWJ6=-<a href="mailto:vc%2BUY6A@mail.gmail.com">vc+UY6A@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="iso-8859-1"<br>
<br>
Hallo,<br>
<br>
ich beschäftige mich grade unteranderem mit TDD unter Perl, kein Problem an<br>
sich Perl lässt sich sehr gut testen.<br>
Leider weiß ich nicht so richtig  wie ich Zugriffe auf eine Datei Testen<br>
soll, ich will ja nicht jedes mal aufs Filessystem.<br>
Wenn ich jetzt sowas hab:<br>
sub read_from_file<br>
{<br>
  my @insert_line = ();<br>
  open(OUT, ">>", $file) or die qq/any errormessage/;<br>
  while (<OUT>)<br>
  {<br>
    push(@insert_line, $_);<br>
  }<br>
  close(OUT);<br>
  return \@insert_line;<br>
}<br>
<br>
Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend<br>
interessieren.<br>
Wenn ich aber danach google, finde ich leider nur Artikel zu den Dateitest<br>
Operatoren oden dem DATA Filehandle.<br>
<br>
Danke im Vorraus<br>
<br>
Gruß,<br>
Basti<br>
-------------- nächster Teil --------------<br>
Ein Dateianhang mit HTML-Daten wurde abgetrennt...<br>
URL: <<a href="http://mail.pm.org/pipermail/dresden-pm/attachments/20120331/9d4b6667/attachment-0001.html" target="_blank">http://mail.pm.org/pipermail/dresden-pm/attachments/20120331/9d4b6667/attachment-0001.html</a>><br>

<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Sun, 01 Apr 2012 08:24:16 +0200<br>
From: "Steffen Winkler" <<a href="mailto:steffen.winkler@gmx.net">steffen.winkler@gmx.net</a>><br>
To: <a href="mailto:dresden-pm@pm.org">dresden-pm@pm.org</a><br>
Subject: Re: [Dresden-pm] Filehandles testen<br>
Message-ID: <<a href="mailto:20120401062416.26560@gmx.net">20120401062416.26560@gmx.net</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hallo Sebastian,<br>
<br>
Du kannst das File auch mit IO::File lesen.<br>
Zum Testen tauschst Du dann das echte IO::File gegen ein gemocktes aus.<br>
Entweder Du nimmst die Mock Module dafür oder Du schreibst ein IO::File selbst, speziell für diesen Test.<br>
<br>
ungetestet:<br>
<br>
my $file_handle = IO::File->new($file, '<') or die $!;<br>
my @insert_line = $file_handle->get_lines;<br>
$! and die $!; # es gibt auch Fehler beim Datei lesen<br>
$file_handle->close; # close Fehler gibt es nur beim Schreiben<br>
return \@insert_line;<br>
<br>
--Steffen<br>
<br>
-------- Original-Nachricht --------<br>
> Datum: Sat, 31 Mar 2012 23:13:24 +0200<br>
> Von: Sebastian Oeste <<a href="mailto:oeste.sebastian@googlemail.com">oeste.sebastian@googlemail.com</a>><br>
> An: <a href="mailto:dresden-pm@pm.org">dresden-pm@pm.org</a><br>
> Betreff: [Dresden-pm] Filehandles testen<br>
<br>
> Hallo,<br>
><br>
> ich beschäftige mich grade unteranderem mit TDD unter Perl, kein Problem<br>
> an<br>
> sich Perl lässt sich sehr gut testen.<br>
> Leider weiß ich nicht so richtig  wie ich Zugriffe auf eine Datei Testen<br>
> soll, ich will ja nicht jedes mal aufs Filessystem.<br>
> Wenn ich jetzt sowas hab:<br>
> sub read_from_file<br>
> {<br>
>   my @insert_line = ();<br>
>   open(OUT, ">>", $file) or die qq/any errormessage/;<br>
>   while (<OUT>)<br>
>   {<br>
>     push(@insert_line, $_);<br>
>   }<br>
>   close(OUT);<br>
>   return \@insert_line;<br>
> }<br>
><br>
> Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend<br>
> interessieren.<br>
> Wenn ich aber danach google, finde ich leider nur Artikel zu den Dateitest<br>
> Operatoren oden dem DATA Filehandle.<br>
><br>
> Danke im Vorraus<br>
><br>
> Gruß,<br>
> Basti<br>
<br>
--<br>
NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone!<br>
Jetzt informieren: <a href="http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a" target="_blank">http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Sun, 1 Apr 2012 08:37:59 +0200<br>
From: Maik Hentsche <<a href="mailto:maik@mm-double.de">maik@mm-double.de</a>><br>
To: <a href="mailto:dresden-pm@pm.org">dresden-pm@pm.org</a><br>
Subject: Re: [Dresden-pm] Filehandles testen<br>
Message-ID: <20120401083759.293ba0e7@zeus><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Sebastian Oeste <<a href="mailto:oeste.sebastian@googlemail.com">oeste.sebastian@googlemail.com</a>> wrote:<br>
<br>
> sub read_from_file<br>
> {<br>
>   my @insert_line = ();<br>
>   open(OUT, ">>", $file) or die qq/any errormessage/;<br>
>   while (<OUT>)<br>
>   {<br>
>     push(@insert_line, $_);<br>
>   }<br>
>   close(OUT);<br>
>   return \@insert_line;<br>
> }<br>
<br>
Da du deine Funktion read_from_file nennst, würde ich annehmen, dass du<br>
lesen willst. Tatsächlich öffnest du aber zum schreiben. Ich würde dir<br>
auch empfehlen, auf Bareword-Filehandle (OUT) zu verzichten. Damit<br>
handelst du dir Probleme ein, die nicht sein müssen. Bspw. sind<br>
Bareword-Filehandle globale Variablen, du kannst sie also nicht in<br>
rekursiven Funktionen einsetzen. Besser wären lexikalische Filehandle:<br>
  open my $fh, "<", $filename or die;<br>
<br>
<br>
> Habt ihr ne Idee wie ich sowas Testen kann würde mich brennend<br>
> interessieren.<br>
<br>
Da gibt es mehrere Möglichkeiten. Du könntest z.B. eine Datei anlegen,<br>
deren Inhalt du genau kennst.<br>
<br>
  use Test::More;<br>
  use MyPackage;<br>
  my @expected = ("zeile 1\n", "zeile 2\n");<br>
  my $result = MyPackage::read_from_file('t/file_with_known_content');<br>
  is_deeply($result, \@expected, 'Read_from_file known content');<br>
<br>
Du könntest auch ein bekannt funktionierendes Filelese-Modul verwenden<br>
und schauen, ob es das selbe liefert wie deine Funktion:<br>
<br>
  use Test::More;<br>
  use MyPackage;<br>
  use File::Slurp 'read_file';<br>
<br>
  my $expected = read_file('t/file_with_unknown_content');<br>
  my $result   = MyPackage::read_from_file('t/file_with_unknown_content');<br>
  my $joined   = join '', @$result;<br>
<br>
  is($joined, $expected, 'Read_from_file slurp');<br>
<br>
Es kann sein, dass noch andere Testmöglichkeiten sinnvoll sind, je<br>
nachdem, was du testen willst.<br>
<br>
so long<br>
Maik<br>
<br>
--<br>
Der Verstand ist wie eine Fahrkarte. Sie hat nur Sinn wenn man sie<br>
benutzt. (Ernst R. Hauschka (*1926), deutscher Essayist,<br>
Aphoristiker und Bibliothekar)<br>
-------------- nächster Teil --------------<br>
Ein Dateianhang mit Binärdaten wurde abgetrennt...<br>
Dateiname   : signature.asc<br>
Dateityp    : application/pgp-signature<br>
Dateigröße  : 190 bytes<br>
Beschreibung: nicht verfügbar<br>
URL         : <<a href="http://mail.pm.org/pipermail/dresden-pm/attachments/20120401/6c132f24/attachment-0001.bin" target="_blank">http://mail.pm.org/pipermail/dresden-pm/attachments/20120401/6c132f24/attachment-0001.bin</a>><br>

<br>
------------------------------<br>
<br>
_______________________________________________<br>
Dresden-pm mailing list<br>
<a href="mailto:Dresden-pm@pm.org">Dresden-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/dresden-pm" target="_blank">http://mail.pm.org/mailman/listinfo/dresden-pm</a><br>
<br>
Ende Dresden-pm Nachrichtensammlung, Band 102, Eintrag 1<br>
********************************************************<br>
</blockquote></div><br>