X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2F08_Testing.pod;h=72fa1ee1ce3e61972c122dc66a11c2659530cc8c;hb=cacb3819a45beb62da8e38784e503e976e3ebb69;hp=6acafb8554bd8378f3f8816245cf50984dfe669d;hpb=0e6626181deb8ea00d7bdd673717ede28f19bdd2;p=catagits%2FCatalyst-Manual.git diff --git a/lib/Catalyst/Manual/Tutorial/08_Testing.pod b/lib/Catalyst/Manual/Tutorial/08_Testing.pod index 6acafb8..72fa1ee 100644 --- a/lib/Catalyst/Manual/Tutorial/08_Testing.pod +++ b/lib/Catalyst/Manual/Tutorial/08_Testing.pod @@ -63,8 +63,9 @@ ensure that your application is working correctly at the present time, but also provide automated regression testing as you upgrade various pieces of your application over time. -You can check out the source code for this example from the Catalyst -Subversion repository as per the instructions in +Source code for the tutorial in included in the F +directory of the Tutorial Virtual machine (one subdirectory per +chapter). There are also instructions for downloading the code in L. For an excellent introduction to learning the many benefits of testing @@ -82,7 +83,7 @@ directory, enter: $ 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 a quick +in F (see the C tip below for a quick and easy way to reduce the clutter). Look for lines like this for errors: @@ -94,7 +95,7 @@ The redirection used by the Authentication plugins will cause several failures in the default tests. You can fix this by making the following changes: -1) Change the line in C that reads: +1) Change the line in F that reads: ok( request('/')->is_success, 'Request should succeed' ); @@ -102,7 +103,7 @@ to: ok( request('/login')->is_success, 'Request should succeed' ); -2) Change the line in C that reads: +2) Change the line in F that reads: ok( request('/logout')->is_success, 'Request should succeed' ); @@ -110,7 +111,7 @@ to: ok( request('/logout')->is_redirect, 'Request should succeed' ); -3) Change the line in C that reads: +3) Change the line in F that reads: ok( request('/books')->is_success, 'Request should succeed' ); @@ -118,7 +119,7 @@ to: ok( request('/books')->is_redirect, 'Request should succeed' ); -4) Add the following statement to the top of C: +4) Add the following statement to the top of F: use MyApp; @@ -126,13 +127,13 @@ As you can see in the C command line above, the C<-l> option (or C<--lib> if you prefer) is used to set the location of the Catalyst C directory. With this command, you will get all of the usual development server debug output, something most people prefer to disable -while running tests cases. Although you can edit the C to +while running tests cases. Although you can edit the F to comment out the C<-Debug> plugin, it's generally easier to simply set the C environment variable. For example: $ CATALYST_DEBUG=0 prove -wl t -During the C and C tests, you might notice the +During the F and F tests, you might notice the C warning message. To execute the Pod-related tests, add C to the C command: @@ -174,25 +175,25 @@ a user "clicking around" inside your application. It gives you all the benefits of testing on a live system without the messiness of having to use an actual web server, and a real person to do the clicking. -To create a sample test case, open the C file in your +To create a sample test case, open the F file in your editor and enter the following: #!/usr/bin/env perl - + use strict; use warnings; use Test::More; - + # Need to specify the name of your app as arg on next line # Can also do: # use Test::WWW::Mechanize::Catalyst "MyApp"; - + BEGIN { use_ok("Test::WWW::Mechanize::Catalyst" => "MyApp") } - + # Create two 'user agents' to simulate two different users ('test01' & 'test02') my $ua1 = Test::WWW::Mechanize::Catalyst->new; my $ua2 = Test::WWW::Mechanize::Catalyst->new; - + # Use a simplified for loop to do tests that are common to both users # Use get_ok() to make sure we can hit the base URL # Second arg = optional description of test (will be displayed for failed tests) @@ -203,7 +204,7 @@ editor and enter the following: # Use content_contains() to match on text in the html body $_->content_contains("You need to log in to use this application", "Check we are NOT logged in") for $ua1, $ua2; - + # Log in as each user # Specify username and password on the URL $ua1->get_ok("http://localhost/login?username=test01&password=mypass", "Login 'test01'"); @@ -213,19 +214,19 @@ editor and enter the following: username => 'test02', password => 'mypass', }); - + # Go back to the login page and it should show that we are already logged in $_->get_ok("http://localhost/login", "Return to '/login'") for $ua1, $ua2; $_->title_is("Login", "Check for login page") for $ua1, $ua2; $_->content_contains("Please Note: You are already logged in as ", "Check we ARE logged in" ) for $ua1, $ua2; - + # 'Click' the 'Logout' link (see also 'text_regex' and 'url_regex' options) $_->follow_link_ok({n => 4}, "Logout via first link on page") for $ua1, $ua2; $_->title_is("Login", "Check for login title") for $ua1, $ua2; $_->content_contains("You need to log in to use this application", "Check we are NOT logged in") for $ua1, $ua2; - + # Log back in $ua1->get_ok("http://localhost/login?username=test01&password=mypass", "Login 'test01'"); @@ -233,11 +234,11 @@ editor and enter the following: "Login 'test02'"); # Should be at the Book List page... do some checks to confirm $_->title_is("Book List", "Check for book list title") for $ua1, $ua2; - + $ua1->get_ok("http://localhost/books/list", "'test01' book list"); $ua1->get_ok("http://localhost/login", "Login Page"); $ua1->get_ok("http://localhost/books/list", "'test01' book list"); - + $_->content_contains("Book List", "Check for book list title") for $ua1, $ua2; # Make sure the appropriate logout buttons are displayed $_->content_contains("/logout\">User Logout", @@ -246,9 +247,9 @@ editor and enter the following: "'test01' should have a create link"); $ua2->content_lacks("/books/form_create\">Admin Create", "'test02' should NOT have a create link"); - + $ua1->get_ok("http://localhost/books/list", "View book list as 'test01'"); - + # User 'test01' should be able to create a book with the "formless create" URL $ua1->get_ok("http://localhost/books/url_create/TestTitle/2/4", "'test01' formless create"); @@ -259,13 +260,13 @@ editor and enter the following: # Try a regular expression to combine the previous 3 checks & account for whitespace $ua1->content_like(qr/Added book 'TestTitle'\s+by 'Stevens'\s+with a rating of 2./, "Regex check"); - + # Make sure the new book shows in the list $ua1->get_ok("http://localhost/books/list", "'test01' book list"); $ua1->title_is("Book List", "Check logged in and at book list"); $ua1->content_contains("Book List", "Book List page test"); $ua1->content_contains("TestTitle", "Look for 'TestTitle'"); - + # Make sure the new book can be deleted # Get all the Delete links on the list page my @delLinks = $ua1->find_all_links(text => 'Delete'); @@ -274,14 +275,14 @@ editor and enter the following: # Check that delete worked $ua1->content_contains("Book List", "Book List page test"); $ua1->content_like(qr/Deleted book \d+/, "Deleted book #"); - + # 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 +The F test cases uses copious comments to explain each step of the process. In addition to the techniques shown here, there are a variety of other methods available in L (for example, regex-based matching). Consult @@ -356,13 +357,13 @@ databases. 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: +F in your editor and change the +C<< __PACKAGE__->config(... >> declaration to resemble: my $dsn = $ENV{MYAPP_DSN} ||= 'dbi:SQLite:myapp.db'; __PACKAGE__->config( schema_class => 'MyApp::Schema', - + connect_info => { dsn => $dsn, user => '', @@ -384,15 +385,15 @@ before. =head2 DATABASE CONFIG SWITCHING USING MULTIPLE CONFIG FILES -L has functionality to load loading -multiple config files based on environment variablesi, allowing you to +L has functionality to load +multiple config files based on environment variables, allowing you to override your default (production) database connection settings during development (or vice versa). Setting C<$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> to 'testing' in your test script results in loading of an additional config file named -C after C which will override any -parameters in C. +F after F which will override any +parameters in F. 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 @@ -415,32 +416,33 @@ 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' ); +You can jump to the next chapter of the tutorial here: +L + + =head1 AUTHOR Kennedy Clark, C Feel free to contact the author for any errors or suggestions, but the best way to report issues is via the CPAN RT Bug system at -. - -The most recent version of the Catalyst Tutorial can be found at -L. +L. -Copyright 2006-2010, Kennedy Clark, under the +Copyright 2006-2011, Kennedy Clark, under the Creative Commons Attribution Share-Alike License Version 3.0 (L).