X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Manual.git;a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2F08_Testing.pod;h=b555c2268c4a783b695a2d7418776b39fa403df3;hp=a3889b40d7ac312d7607a3748a724b2bfe26e74f;hb=6c0a745efa9798edf8e9ac231027bfc997485054;hpb=87058ad44d035b5c60be933ea3f5f236f36c912e diff --git a/lib/Catalyst/Manual/Tutorial/08_Testing.pod b/lib/Catalyst/Manual/Tutorial/08_Testing.pod index a3889b4..b555c22 100644 --- a/lib/Catalyst/Manual/Tutorial/08_Testing.pod +++ b/lib/Catalyst/Manual/Tutorial/08_Testing.pod @@ -79,7 +79,7 @@ C and C), but one of the easiest is with the C command. For example, to run all of the tests in the C directory, enter: - $ prove --lib lib t + $ prove -wl t There will be a lot of output because we have the C<-Debug> flag enabled in C (see the C tip below for @@ -130,37 +130,14 @@ Although you can edit the C to comment out the C<-Debug> plugin, it's generally easier to simply set the C environment variable. For example: - $ CATALYST_DEBUG=0 prove --lib lib t - -B Depending on the versions of various modules you have -installed, you might get some C warnings -- you can -ignore these. If you want to eliminate the warnings, you can -edit C to disable and then re-enable warnings -are the C line in C. -You can locate where C is located with the -following command (it's probably in a place similar to -C): - - perldoc -l Template::Base - -Edit the file and modify C to match: - - ... - { no strict qw( refs ); - # Disable warnings - no warnings; - $argnames = \@{"$class\::BASEARGS"} || [ ]; - # Turn warnings back on - use warnings; - } - ... + $ CATALYST_DEBUG=0 prove -wl t During the C and C tests, you might notice the C warning message. To execute the Pod-related tests, add C to the C command: - $ CATALYST_DEBUG=0 TEST_POD=1 prove --lib lib t + $ CATALYST_DEBUG=0 TEST_POD=1 prove -wl t If you omitted the Pod comments from any of the methods that were inserted, you might have to go back and fix them to get these tests to @@ -169,7 +146,7 @@ pass. :-) Another useful option is the C (C<-v>) option to C. It prints the name of each test case as it is being run: - $ CATALYST_DEBUG=0 TEST_POD=1 prove --lib lib -v t + $ CATALYST_DEBUG=0 TEST_POD=1 prove -vwl t =head1 RUNNING A SINGLE TEST @@ -177,12 +154,12 @@ prints the name of each test case as it is being run: You can also run a single script by appending its name to the C command. For example: - $ CATALYST_DEBUG=0 prove --lib lib t/01app.t + $ CATALYST_DEBUG=0 prove -wl t/01app.t Also note that you can also run tests directly from Perl without C. For example: - $ CATALYST_DEBUG=0 perl -Ilib t/01app.t + $ CATALYST_DEBUG=0 perl -w -Ilib t/01app.t =head1 ADDING YOUR OWN TEST SCRIPT @@ -205,13 +182,7 @@ editor and enter the following: use strict; use warnings; - - # Load testing framework and use 'no_plan' to dynamically pick up - # all tests. Better to replace "'no_plan'" with "tests => 30" so it - # knows exactly how many tests need to be run (and will tell you if - # not), but 'no_plan' is nice for quick & dirty tests - - use Test::More 'no_plan'; + use Test::More; # Need to specify the name of your app as arg on next line # Can also do: @@ -305,6 +276,8 @@ editor and enter the following: # User 'test02' should not be able to add a book $ua2->get_ok("http://localhost/books/url_create/TestTitle2/2/5", "'test02' add"); $ua2->content_contains("Unauthorized!", "Check 'test02' cannot add"); + + done_testing; The C test cases uses copious comments to explain each step of the process. In addition to the techniques shown here, there are a @@ -324,11 +297,11 @@ template). To run the new test script, use a command such as: - $ CATALYST_DEBUG=0 prove --lib lib -v t/live_app01.t + $ CATALYST_DEBUG=0 prove -vwl t/live_app01.t or - $ DBIC_TRACE=0 CATALYST_DEBUG=0 prove --lib lib -v t/live_app01.t + $ DBIC_TRACE=0 CATALYST_DEBUG=0 prove -vwl t/live_app01.t Experiment with the C, C and C<-v> settings. If you find that there are errors, use the techniques @@ -376,7 +349,11 @@ maintain both a "production database" for your live application and a "testing database" for your test cases. One advantage to L is that it runs your full application; however, this can complicate things when -you want to support multiple databases. One solution is to allow the +you want to support multiple databases. + +=head2 DATABASE CONFIG SWITCHING IN YOUR MODEL CLASS + +One solution is to allow the database specification to be overridden with an environment variable. For example, open C in your editor and change the C<__PACKAGE__-Econfig(...> declaration to resemble: @@ -384,21 +361,69 @@ change the C<__PACKAGE__-Econfig(...> declaration to resemble: my $dsn = $ENV{MYAPP_DSN} ||= 'dbi:SQLite:myapp.db'; __PACKAGE__->config( schema_class => 'MyApp::Schema', - connect_info => [ - $dsn, - ], + + connect_info => { + dsn => $dsn, + user => '', + password => '', + on_connect_do => q{PRAGMA foreign_keys = ON}, + } ); Then, when you run your test case, you can use commands such as: $ cp myapp.db myappTEST.db - $ CATALYST_DEBUG=0 MYAPP_DSN="dbi:SQLite:myappTEST.db" prove --lib lib -v t/live_app01.t + $ CATALYST_DEBUG=0 MYAPP_DSN="dbi:SQLite:myappTEST.db" prove -vwl t/live_app01.t This will modify the DSN only while the test case is running. If you launch your normal application without the C environment variable defined, it will default to the same C as before. +=head2 DATABASE CONFIG SWITCHING USING MULTIPLE CONFIG FILES + +By utilizing Ls functionality for loading +multiple config files based on environment variables you can override your +default (production) database connection settings. + +Setting C<$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> to 'testing' in your test script +results in loading of an additional config file named myapp_testing.conf after +myapp.conf which will override any parameters in myapp.conf. + +You should set the environment variable in the BEGIN block of your test script +to make sure it's set before your Catalyst application is started. + +The following is an example for a config and test script for a DBIx::Class +model named MyDB and a controller named Foo: + +myapp_testing.conf: + + + + dsn dbi:SQLite:myapp.db + + + + +t/controller_Foo.t: + + use strict; + use warnings; + use Test::More; + + BEGIN { + $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX } = 'testing'; + } + + eval "use Test::WWW::Mechanize::Catalyst 'MyApp'"; + plan $@ + ? ( skip_all => 'Test::WWW::Mechanize::Catalyst required' ) + : ( tests => 2 ); + + ok( my $mech = Test::WWW::Mechanize::Catalyst->new, 'Created mech object' ); + + $mech->get_ok( 'http://localhost/foo' ); + =head1 AUTHOR