-
-Submitting a simple form
-
-
- When a page is fetched by the WebTestCase - using get() or - post() the page content is - automatically parsed. - This results in any form controls that are inside <form> tags - being available from within the test case. - For example, if we have this snippet of HTML... -
-<form> - <input type="text" name="a" value="A default" /> - <input type="submit" value="Go" /> -</form> -- Which looks like this... - -
-
- -- We can navigate to this code, via the - LastCraft - site, with the following test... -
-class SimpleFormTests extends WebTestCase {
-
- function testDefaultValue() {
- $this->get('http://www.lastcraft.com/form_testing_documentation.php');
- $this->assertField('a', 'A default');
- }
-}
-
- Immediately after loading the page all of the HTML controls are set at
- their default values just as they would appear in the web browser.
- The assertion tests that a HTML widget exists in the page with the
- name "a" and that it is currently set to the value
- "A default"
-
- - We could submit the form straight away, but first we'll change - the value of the text field and only then submit it... -
-class SimpleFormTests extends WebTestCase {
-
- function testDefaultValue() {
- $this->get('http://www.my-site.com/');
- $this->assertField('a', 'A default');
- $this->setField('a', 'New value');
- $this->clickSubmit('Go');
- }
-}
-
- Because we didn't specify a method attribute on the form tag, and
- didn't specify an action either, the test case will follow
- the usual browser behaviour of submitting the form data as a GET
- request back to the same location.
- SimpleTest tries to emulate typical browser behaviour as much as possible,
- rather than attempting to catch missing attributes on tags.
- This is because the target of the testing framework is the PHP application
- logic, not syntax or other errors in the HTML code.
- For HTML errors, other tools such as
- HTMLTidy should be used.
-
- - If a field is not present in any form, or if an option is unavailable, - then WebTestCase::setField() will return - false. - For example, suppose we wish to verify that a "Superuser" - option is not present in this form... -
-<strong>Select type of user to add:</strong> -<select name="type"> - <option>Subscriber</option> - <option>Author</option> - <option>Administrator</option> -</select> -- Which looks like... - -
-
- -- The following test will confirm it... -
-class SimpleFormTests extends WebTestCase {
- ...
- function testNoSuperuserChoiceAvailable() {
- $this->get('http://www.lastcraft.com/form_testing_documentation.php');
- $this->assertFalse($this->setField('type', 'Superuser'));
- }
-}
-
- The selection will not be changed on a failure to set
- a widget value.
-
- - Here is the full list of widgets currently supported... -
-
-
- Text fields, including hidden and password fields. -
- Submit buttons including the button tag, although not yet reset buttons -
- Text area. This includes text wrapping behaviour. -
- Checkboxes, including multiple checkboxes in the same form. -
- Drop down selections, including multiple selects. -
- Radio buttons. -
- Images. -
- Although most standard HTML widgets are catered for by SimpleTest's - built in parser, it is unlikely that JavaScript will be implemented - anytime soon. -
- -
-
-Fields with multiple values
-
-
- SimpleTest can cope with two types of multivalue controls: Multiple - selection drop downs, and multiple checkboxes with the same name - within a form. - The multivalue nature of these means that setting and testing - are slightly different. - Using checkboxes as an example... -
-<form class="demo"> - <strong>Create privileges allowed:</strong> - <input type="checkbox" name="crud" value="c" checked><br> - <strong>Retrieve privileges allowed:</strong> - <input type="checkbox" name="crud" value="r" checked><br> - <strong>Update privileges allowed:</strong> - <input type="checkbox" name="crud" value="u" checked><br> - <strong>Destroy privileges allowed:</strong> - <input type="checkbox" name="crud" value="d" checked><br> - <input type="submit" value="Enable Privileges"> -</form> -- Which renders as... - -
-
- -- If we wish to disable all but the retrieval privileges and - submit this information we can do it like this... -
-class SimpleFormTests extends WebTestCase {
- ...
- function testDisableNastyPrivileges() {
- $this->get('http://www.lastcraft.com/form_testing_documentation.php');
- $this->assertField('crud', array('c', 'r', 'u', 'd'));
- $this->setField('crud', array('r'));
- $this->clickSubmit('Enable Privileges');
- }
-}
-
- Instead of setting the field to a single value, we give it a list
- of values.
- We do the same when testing expected values.
- We can then write other test code to confirm the effect of this, perhaps
- by logging in as that user and attempting an update.
-
-
-
-Raw posting
-
-
- If you want to test a form handler, but have not yet written - or do not have access to the form itself, you can create a - form submission by hand. -
-class SimpleFormTests extends WebTestCase {
- ...
- function testAttemptedHack() {
- $this->post(
- 'http://www.my-site.com/add_user.php',
- array('type' => 'superuser'));
- $this->assertNoUnwantedPattern('/user created/i');
- }
-}
-
- By adding data to the WebTestCase::post()
- method, we are attempting to fetch the page as a form submission.
-
-
-