[ prev SettingUpForUnitTestingMyLibrary | next UnitTestingMyLibraryPrintHeader | top UnitTestingMyLibrary ]
As simple subroutine to start with is MyLibrary::printFooter:
sub printFooter { # if the footer file exists ($footer), then slup it up and print it #print "\n\n<!-- F O O T E R -->\n"; #if (-e $footer) { # # my $b = `cat $footer`; # print $b; # #} print $gFooter; }This subroutine has grown moribund with all but one line commented out due to changes in the design to put the standard page footer into the database. This makes it a nice simple starting place. The only data it uses is one global string variable, $gFooter, and it's only action is to print the contents of that variable.
The set_up and tear_down methods are simple:
# ---------- tests for &MyLibrary::printFooter ---------- package printFooter; require "../MyLibrary.pm"; sub set_up { $MyLibrary::gFooter = "***FOOTER TEXT***"; } sub tear_down { $MyLibrary::gFooter = undef; }All the variables defined in set_up need to be set back to undef in tear_down to avoid interference with other tests. The $MyLibrary NameSpace qualification is necessary to ensure that the variable will be available to the subroutine being tested.
There is a difficulty caused by the print statement; the subroutine doesn't return a value it simply prints it to STDOUT. Many of the subroutines in MyLibrary.pm print various parts of an HTML page to STDOUT, so we need a way to capture the printed values in order to test that the subroutine worked as expected.
The solution is to capture printed output into a variable. This leads to another Perl module that is required for this to be done as easily as possible, IO::String. The result is a new set_up and tear_down routine.
# ---------- tests for &MyLibrary::printFooter ---------- package printFooter; use Test::Unit; require "../MyLibrary.pm"; use IO::String; sub set_up { $io = IO::String->new($result); $old_handle = select($io); $MyLibrary::gFooter = "***FOOTER TEXT***"; } sub tear_down { select($old_handle); $io = undef; $result = undef; $old_handle = undef; $MyLibrary::gFooter = undef; }That prepares the ground for the first test.
sub test_footer { my $expected = $MyLibrary::gFooter; &MyLibrary::printFooter; assert($result eq $expected, "printFooter failed when gFooter given"); }The only other possible starting condition to test that leaps to mind is the case where printFooter is called but $gFooter hasn't been defined yet. Here Perl will print nothing without complaining about the undefined variable so the test should be.
sub test_no_footer { my $expected = ""; $MyLibrary::gFooter = undef; &MyLibrary::printFooter; assert($result eq $expected, "printFooter failed when no gFooter given"); }That completes the TestCase and all that remains is to add the code that will run these tests. This creates a main TestSuite, creates a suite specifically for Mylibrary::printFooter and adds it to the main suite. Then it runs the main suite.
# ---------- run all tests ---------- package MyLibrary; use Test::Unit; create_suite(); create_suite("printFooter"); add_suite("printFooter"); run_suite();