Dave Rolsky > Test-Class-Moose > Test::Class::Moose::Load

Download:
Test-Class-Moose-0.55-TRIAL.tar.gz

Dependencies

Annotate this POD

Website

View/Report Bugs
Module Version: 0.55   Source  

NAME ^

Test::Class::Moose::Load - Load Test::Class::Moose classes automatically.

VERSION ^

version 0.55

SYNOPSIS ^

 use Test::Class::Moose::Load qw(t/tests t/lib);
 Test::Class::Moose->runtests;

DESCRIPTION ^

Note: This helper module was blatantly stolen from Test::Class::Load. However, since your author is the person who originally wrote that code, he doesn't feel too bad.

Without a loader, you would have to manually load each test class in your test file. This would look something like this:

 #!/usr/bin/perl -T

 use strict;
 use warnings;

 use Test::Class::Moose::Runner;

 use lib 't/tests';

 use MyTest::Foo;
 use MyTest::Foo::Bar;
 use MyTest::Foo::Baz;

 Test::Class::Moose::Runner->runtests;

This causes a problem, though. When you're writing a test class, it's easy to forget to add it to the helper script. Then you run your huge test suite and see that all tests pass, even though you don't notice that it didn't run your new test class. Or you delete a test class and you forget to remove it from the helper script.

Test::Class::Moose::Load automatically finds and loads your test classes for you. There is no longer a need to list them individually.

EXPORT ^

None.

BASIC USAGE ^

Using Test::Class::Moose::Load is as simple as this:

 #!/usr/bin/perl -T

 use strict;
 use warnings;

 use Test::Class::Moose::Runner;
 use Test::Class::Moose::Load 't/tests';

 Test::Class::Moose::Runner->new(\%args)->runtests;

That will search through all files in the t/tests directory and automatically load anything which ends in .pm. You should only put test classes in those directories.

If you have test classes in more than one directory, that's OK. Just list all of them in the import list.

 use Test::Class::Moose::Load qw<
   t/customer
   t/order
   t/inventory
 >;
 Test::Class::Moose::Runner->runtests;

ADVANCED USAGE ^

Here's some examples of advanced usage of Test::Class::Moose::Load.

FILTER LOADED CLASSES

You can redefine the filtering criteria, that is, decide what classes are picked up and what others are not. You do this simply by subclassing Test::Class::Moose::Load overriding the is_test_class() method. You might want to do this to only load modules which inherit from Test::Class::Moose, or anything else for that matter.

is_test_class
  $is_test_class = $class->is_test_class( $file, $directory )

Returns true if $file in $directory should be considered a test class and be loaded by Test::Class::Moose::Load. The default filter simply returns true if $file ends with .pm

For example:

  use strict;
  use warnings;

  package My::Loader;
  use base qw( Test::Class::Moose::Load );

  # Overriding this selects what test classes
  # are considered by T::C::Load
  sub is_test_class {
      my ( $class, $file, $dir ) = @_;

      # return unless it's a .pm (the default)
      return unless $class->SUPER::is_test_class( $file, $dir );

      # and only allow .pm files with "Good" in their filename
      return $file =~ m{Good};
  }

  1;

CUSTOMIZING TEST RUNS

One problem with this style of testing is that you run all of the tests every time you need to test something. If you want to run only one test class, it's problematic. The easy way to do this is to change your helper script by deleting the runtests call:

 #!/usr/bin/perl -T

 use strict;
 use warnings;

 use Test::Class::Moose::Load 't/tests';

Then, just make sure that all of your test classes inherit from your own base class which runs the tests for you. It might looks something like this:

 package My::Test::Class::Moose;

 use strict;
 use warnings;

 use Test::Class::Moose::Runner;

 use base 'Test::Class::Moose';

 INIT { Test::Class::Moose::Runner->new->runtests } # here's the magic!

 1;

Then you can run an individual test class by using the prove utility, tell it the directory of the test classes and the name of the test package you wish to run:

 prove -lv -It/tests Some::Test::Class::Moose

You can even automate this by binding it to a key in vim:

 noremap ,t  :!prove -lv -It/tests %<CR>

Then you can just type ,t ('comma', 'tee') and it will run the tests for your test class or the tests for your test script (if you're using a traditional Test::More style script).

Of course, you can still run your helper script with prove, make test or ./Build test to run all of your test classes.

If you do that, you'll have to make sure that the -I switches point to your test class directories.

SECURITY ^

Test::Class::Moose::Load is taint safe. Because we're reading the class names from the directory structure, they're marked as tainted when running under taint mode. We use the following ultra-paranoid bit of code to untaint them. Please file a bug report if this is too restrictive.

 my ($package) = $_package =~ /^([[:word:]]+(?:::[[:word:]]+)*)$/;

BUGS ^

Please report any bugs or feature requests to bug-test-class-load@rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Class-Load. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

ACKNOWLEDGMENTS ^

Thanks to David Wheeler for the idea and Adrian Howard for Test::Class::Moose.

AUTHOR ^

Curtis "Ovid" Poe <ovid@cpan.org>

COPYRIGHT AND LICENSE ^

This software is copyright (c) 2014 by Curtis "Ovid" Poe.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

syntax highlighting: