+1 from me! I like Test::Class and would welcome a Moose-ish variety.

On Dec 12, 2012, at 9:51 AM, Ovid <publiustemp-perl...@yahoo.com> wrote:

> Hi all,
> 
> People keep asking me how to properly integrate Moose with Test::Class. I 
> know about Test::Able and some alternatives, but I *generally* like 
> Test::Class's interface (or maybe I'm just in a comfort zone). So I wrote my 
> own Test::Class::Moose (it does not use Test::Class) and it uses subtests all 
> the way down.
> 
> Every test class is one test. Every test method is a subtest in the test 
> class. Every test in a test method is, well, one test in a test method. 
> Here's a simple test class which, in turn, inherits from another test class 
> (you get all of the functions from Test::Most along with Moose helper 
> functions, if desired):
> 
>     package TestsFor::Basic::Subclass;                                        
>                                                                           
>     use Test::Class::Moose parent => 'TestsFor::Basic';
> 
>     sub test_startup {
>         my $test = shift;
>         $test->next::method;
>         # more startup here, but tests are not allowed
>     }
> 
>     sub test_me {
>         my $test  = shift;
>         my $class = $test->this_class;
>         ok 1, "I overrode my parent! ($class)";
>     }
> 
>     before 'test_this_baby' => sub {
>         my $test  = shift;
>         my $class = $test->this_class;
>         pass "This should run before my parent method ($class)";
>     };
> 
>     sub this_should_not_run {
>         fail "We should never see this test";
>     }
> 
>     sub test_this_should_be_run {
>         for ( 1 .. 5 ) {
>             pass "This is test number $_ in this method";
>         }
>     }
> 
>     1;
> 
> Note that attributes are not required on the test methods. Methods which 
> start with "test_" are considered test methods (you can override this 
> behavior, of course). That includes the test control methods of 
> test_startup(), test_setup(), and so on.
> 
> You should be able to consume roles or use the rest of Moose any way you 
> think you should.
> 
> Here's how we load and run tests:
> 
>     use Test::Class::Moose::Load qw(t/lib);
> 
>     Test::Class::Moose->new({
>         # timing on a class and method level
>         show_timing => 0,
>         # how many classes, methods and tests
>         statistics  => 1,
>     })->runtests; 
> 
> My main concern is that the nested subtests will annoy people:
> 
>     # 
>     # Executing tests for TestsFor::Basic::Subclass
>     #
>         # TestsFor::Basic::Subclass->test_me()
>             ok 1 - I overrode my parent! (TestsFor::Basic::Subclass)
>             1..1
>         ok 1 - test_me
>         # TestsFor::Basic::Subclass->test_this_baby()
>             ok 1 - This should run before my parent method 
> (TestsFor::Basic::Subclass)
>             ok 2 - whee! (TestsFor::Basic::Subclass)
>             1..2
>         ok 2 - test_this_baby
>         # TestsFor::Basic::Subclass->test_this_should_be_run()
>             ok 1 - This is test number 1 in this method
>             ok 2 - This is test number 2 in this method
>             ok 3 - This is test number 3 in this method
>             ok 4 - This is test number 4 in this method
>             ok 5 - This is test number 5 in this method
>             1..5
>         ok 3 - test_this_should_be_run
>         1..3
>     ok 1 - TestsFor::Basic::Subclass
>     # 
>     # Executing tests for TestsFor::Basic
>     # 
>         # TestsFor::Basic->test_me()
>             ok 1 - test_me() ran (TestsFor::Basic)
>             ok 2 - this is another test (TestsFor::Basic)
>             1..2
>         ok 1 - test_me
>         # TestsFor::Basic->test_this_baby()
>             ok 1 - whee! (TestsFor::Basic)
>             1..1
>         ok 2 - test_this_baby
>         1..2
>     ok 2 - TestsFor::Basic
>     1..2
>     # Test classes:    2
>     # Test methods:    5
>     # Total tests run: 11
>     ok
>     All tests successful.
>     Files=1, Tests=2,  2 wallclock secs
>     Result: PASS
> 
> So, does this look useful for folks? Is there anything you would change? 
> (It's trivial to assert plans for classes and the entire test suite rather 
> than rely on done_testing(), but I haven't done that yet).
> 
> Cheers,
> Ovid
> --
> Twitter - http://twitter.com/OvidPerl/
> Buy my book - http://bit.ly/beginning_perl
> Buy my other book - http://www.oreilly.com/catalog/perlhks/
> Live and work overseas - http://www.overseas-exile.com/

Reply via email to