Meise2000: Dereferenzierung von Subroutinen

Hallo zusammen,

ich habe folgende Subroutine:

  
sub getMyHash {  
  my %hash = (  
    'key1' => \&_handleKey1,  
    'key2' => \&_handleKey2,  
    'key3' => \&_handleKey3  
  );  
  return \%hash;  
)  

Für meinen Unit-Test möchte ich nun gerne wissen, ob ich für jeden Key auch auf die richtige Subroutine gemapt hat.

  
sub test_Mapping {  
  my ($this) = @_;  
  my $hashRef = mypackage::getMyHash();  
  $this->assert_equals('HASH', ref($hashRef));  
  $this->assert_equals('_handleKey1', &{$hashRef->{'key1'}});  
}  

Leider funktioniert das natürlich nicht. Wie komme ich an den Namen der Subroutine ran?

Gruß,
Meise.

  1. $this->assert_equals('HASH', ref($hashRef));
      $this->assert_equals('_handleKey1', &{$hashRef->{'key1'}});

    Was sind assert_equals für Funktionen?

    Du kommst so auch nicht an den Namen der Funktion nur an sein Referenz. Wozu brauchst du die Namen, ich weiß nicht was du konkret vorhast, aber für mich sieht das umständlich aus.

    Struppi.

    1. Was sind assert_equals für Funktionen?

      http://search.cpan.org/~mcast/Test-Unit-0.25/lib/Test/Unit/TestCase.pm

      Du kommst so auch nicht an den Namen der Funktion nur an sein Referenz. Wozu brauchst du die Namen, ich weiß nicht was du konkret vorhast, aber für mich sieht das umständlich aus.

      Wie gesagt, es handelt sich um UnitTests. (Vielleicht hätte ich noch schreiben sollen, dass das erste Code-Fragment im "echten Code" enthalten ist und das zweite Fragment nur im "Testcode"). Mein Ziel mit diesem Test ist es, sicherzustellen, dass zu jedem Schlüssel die richtige Methode gemappt wird. Ich bin auch für andere Ideen offen...

      Gruß,
      Meise.

      1. Wie gesagt, es handelt sich um UnitTests. (Vielleicht hätte ich noch schreiben sollen, dass das erste Code-Fragment im "echten Code" enthalten ist und das zweite Fragment nur im "Testcode"). Mein Ziel mit diesem Test ist es, sicherzustellen, dass zu jedem Schlüssel die richtige Methode gemappt wird. Ich bin auch für andere Ideen offen...

        Ich bin nicht vertraut mit den Fachtermini, daher kenn ich den Begriff Unittest nicht.

        Die Frage bei deinem Problme ist, was ist die richtige Methode? Mit was willst du vergleichen?

        Struppi.

        1. Ich bin nicht vertraut mit den Fachtermini, daher kenn ich den Begriff Unittest nicht.

          Unit-Tests sind ein relativ einfaches Mittel, um bessere Software zu entwickeln. Gibt viele Artikel im Netz dazu. Auf die Schnelle habe ich mal den hier rausgesucht:

          http://blog.skytecag.com/index.php/2006/02/23/der-pragmatische-weg-zum-unit-test/

          Die Frage bei deinem Problme ist, was ist die richtige Methode? Mit was willst du vergleichen?

          Es reicht mir schon, die Referenzen zu vergleichen. Von daher löst die Idee von batooh mein Problem voll und ganz...

          Gruß,
          Meise

  2. Hallo.

    Leider funktioniert das natürlich nicht. Wie komme ich an den Namen der Subroutine ran?

    Den brauchst du an der Stelle doch gar nicht. Du kannst doch einfach die Referenzen vergleichen.

    An dieser Stelle:

    $this->assert_equals('_handleKey1', &{$hashRef->{'key1'}});

    Sollte folgende Zeile das gewünschte Ergebnis liefern:

    $this->assert_equals(\&_handleKey1, $hashRef->{'key1'});

    Damit vergleichst du die Referenz auf die Subroutine mit der vorhandenen Referenz im Hash.

    Schöne Grüße.

    1. Hallo,

      Sollte folgende Zeile das gewünschte Ergebnis liefern:

      $this->assert_equals(\&_handleKey1, $hashRef->{'key1'});

      das war genau die Idee, die ich brauchte! Vielen Dank!

      Gruß,
      Meise.