Since Test::Class is the closest thing Perl has to junit or cppunit I'm using it to test all the class methods in my Perl classes. Everything was looking good until I told the guy writing the server to integrate with my code. His code died with an error like this:
Can't locate object method "new" via package "Class::A" (perhaps youTaking a quick look inside Class::B revealed that it did try to create a new Class::A object and that, sure enough, there was no use Class::A; anywhere in Class::B. Easy enough bug to fix, but what left me scratching my head was why the unit test suite didn't show this.
forgot to load "Class::A" at Class/B.pm line 147.
For each class I have an equivalent test class (so there's Class::A::Test and Class::B::Test) which are loaded using a .t file which in turn is loaded with prove. The test classes all use Test::Class.
The classes are tested with a Makefile that does the following:
test:And classes.t consists of:
@prove classes.t
use strict;Since the test suite for Class::A does a use Class::A; and the test suite for Class::B does a use Class::B; and the two test suites are loaded using use in classes.t, both Class::A and Class::B are loaded before running the tests. This means that the fact that use Class::A; was missing from Class::B is masked in the test suite.
use warnings;
use Class::A::Test;
use Class::B::Test;
Test::Class->runtest;
The solution is to have two .t files one for each class so that only the class being tested is loaded. So I dumped classes.t and created class_a.t and class_b.t as follows:
use strict;and
use warnings;
use Class::A::Test;
Test::Class->runtest;
use strict;and the Makefile is changed to do:
use warnings;
use Class::B::Test;
Test::Class->runtest;
test:This now works correctly. The missing use Class::A; causes a fatal error in the test suite.
@prove class_a.t class_b.t

10ms
17s
40ms
40ms