Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: Writing tests when you don't know what the output should be

by nysus (Parson)
on May 17, 2016 at 21:58 UTC ( [id://1163273]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Writing tests when you don't know what the output should be
in thread Writing tests when you don't know what the output should be

Sure thing:

package DupEventChecker; use Modern::Perl; use IO::Dir; use Moose; has 'dir' => ( is => 'ro', isa => 'IO::Dir', writer => '_set_dir' ); sub BUILD { my $self = shift; my $args = shift; $self->_set_dir(IO::Dir->new($args->{dir_name})); } return 1;

And here's the script:

use Modern::Perl; use DupEventChecker; my $dir = DupEventChecker->new({dir_name => '.'});

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re^5: Writing tests when you don't know what the output should be
by choroba (Cardinal) on May 17, 2016 at 22:24 UTC
    OK, try adding something like
    use FindBin; use Test::More tests => 3; use Test::Exception; dies_ok { 'DupEventChecker'->new } 'dir_name not provided'; my $checker = 'DupEventChecker'->new(dir_name => $FindBin::Bin); isa_ok $checker, 'DupEventChecker'; my ($itself) = grep { 0 <= index $0, $_ } $checker->dir->read; ok $itself, 'test script found';

    BTW, dir_name is required, but it isn't apparent from the declaration. dir could also have a default (e.g. '.', Cwd::getcwd or File::HomeDir->my_home).

    Update: Example added to the BTW. Update 2: The example was improved.

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      Thanks for this. Can you please help me understand why you used an internal and external accessor for dir? I'm new to Moose and I'm not quite sure why you did that. Thanks.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

        It depends on what you want. My solution expects the user only wants to supply the directory name and doesn't care about the internal implementation. It locks in a dependency, though, so another approach would be to accept just an object with a defined interface (dependency injection) - it's easier to test and extend.

        You should start with a picture, define the behaviours of the objects, and the implementation should emerge from the design, not vice versa.

        ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      One other question about your example if I might impose. That second to last line has me scratching my head. The grep $0 is nothing I'm familiar with and the regex has me baffled as well. Thanks!

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

        my ($itself) = grep { 0 <= index $0, $_ } $checker->dir->read;

        See $0, index, grep. In other words, the read method returns the contents of the directory, grep then tries to find a file name $_ that's contained in the test script's path (it's buggy, as it doesn't check whether the preceding character is a slash).

        m{(?:^|/)\Q$_\E$}x

        The regex fixes the issue: it checks that the filename is present in the script's name from the beginning (^) or a slash to the end ($). \Q quotes special characters in the filename so it matches literally.

        ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
Re^5: Writing tests when you don't know what the output should be
by stevieb (Canon) on May 17, 2016 at 22:46 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1163273]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2024-04-18 04:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found