|
| assert ($expectation, $compare, $notused='') |
|
| assert_select_options ($expectation, $html) |
| Use this function rather than assert when checking the value of options within a select element.
|
|
| assertDebuggingCalled ($debugmessage=null, $debuglevel=null, $message='') |
| Assert that exactly debugging was just called once.
|
|
| assertDebuggingCalledCount ($expectedcount, $debugmessages=array(), $debuglevels=array(), $message='') |
| Asserts how many times debugging has been called.
|
|
| assertDebuggingNotCalled ($message='') |
| Call when no debugging() messages expected.
|
|
| assertEqualsIgnoringWhitespace ($expected, $actual, string $message='') |
| Assert that two Date/Time strings are equal.
|
|
| assertEventContextNotUsed (\core\event\base $event, $message='') |
| Assert that various event methods are not using event->context.
|
|
| assertEventLegacyData ($expected, core\event\base $event, $message='') |
| Assert that an event legacy data is equal to the expected value.
|
|
| assertEventLegacyLogData ($expected, core\event\base $event, $message='') |
| Assert that an event legacy log data is equal to the expected value.
|
|
| assertTimeCurrent ($time, $message='') |
| Assert that: start < $time < time()
|
|
| getDebuggingMessages () |
| Return debugging messages from the current test.
|
|
| getExternalTestFileUrl ($path, $https=false) |
| Returns UTL of the external test file.
|
|
| preventResetByRollback () |
| Call this method from test if you want to make sure that the resetting of database is done the slow way without transaction rollback.
|
|
| recurseFolders ($path, $callback, $fileregexp='/.*/', $exclude=false, $ignorefolders=array()) |
| Recursively visit all the files in the source tree.
|
|
| redirectEmails () |
| Starts email redirection.
|
|
| redirectEvents () |
| Starts event redirection.
|
|
| redirectHook (string $hookname, callable $callback) |
| Override hook callbacks.
|
|
| redirectMessages () |
| Starts message redirection.
|
|
| resetAfterTest ($reset=true) |
| Reset everything after current test.
|
|
| resetDebugging () |
| Clear all previous debugging messages in current test and revert to default DEVELOPER_DEBUG level.
|
|
| runBare () |
| Runs the bare test sequence.
|
|
| setCurrentTimeStart () |
| Stores current time as the base for assertTimeCurrent().
|
|
| stopHookRedirections () |
| Remove all hook overrides.
|
|
| waitForSecond () |
| Wait for a second to roll over, ensures future calls to time() return a different result.
|
|
|
static | assertNotTag ($matcher, $actual, $message='', $ishtml=true) |
| Note: we are overriding this method to remove the deprecated error.
|
|
static | assertTag ($matcher, $actual, $message='', $ishtml=true) |
| Note: we are overriding this method to remove the deprecated error.
|
|
static | assertValidKeys (array $hash, array $validKeys) |
| Validate list of keys in the associative array.
|
|
static | findNodes (DOMDocument $dom, array $options, $isHtml=true) |
| Parse out the options from the tag using DOM object tree.
|
|
static | getDataGenerator () |
| Get data generator.
|
|
static | resetAllData ($detectchanges=false) |
| Reset all database tables, restore global state and clear caches and optionally purge dataroot dir.
|
|
static | setAdminUser () |
| Set current $USER to admin account, reset access cache.
|
|
static | setGuestUser () |
| Set current $USER to guest account, reset access cache.
|
|
static | setTimezone ($servertimezone='Australia/Perth', $defaultphptimezone='Australia/Perth') |
| Change server and default php timezones.
|
|
static | setUser ($user=null) |
| Set current $USER, reset access cache.
|
|
|
| check_comment ($comment, $commentformat) |
| Asserts if the manual comment for the question is equal to the provided arguments.
|
|
| check_current_mark ($mark) |
|
| check_current_output () |
|
| check_current_state ($state) |
|
| check_output_contains ($string) |
|
| check_output_contains_hidden_input ($name, $value) |
|
| check_output_contains_lang_string ($identifier, $component='', $a=null) |
|
| check_output_contains_selectoptions (... $expectations) |
| Use this function rather than check_current_output for select expectations where checking the value of the options is required.
|
|
| check_output_contains_text_input ($name, $value=null, $enabled=true) |
|
| check_output_contains_text_input_with_class ($name, $class=null) |
|
| check_output_does_not_contain ($string) |
|
| check_output_does_not_contain_text_input_with_class ($name, $class=null) |
|
| check_step_count ($expectednumsteps) |
|
| createArrayDataSet () |
|
| createCsvDataSet () |
|
| createXMLDataSet () |
|
| dataset_from_array (array $data) |
| Creates a new dataset from PHP array.
|
|
| dataset_from_files (array $files) |
| Creates a new dataset from CVS/XML files.
|
|
| dataset_from_string (string $content, string $type, ?string $table=null) |
| Creates a new dataset from string (CSV or XML).
|
|
| delete_quba () |
|
| finish () |
|
| get_contains_button_expectation ($name, $value=null, $enabled=null) |
|
| get_contains_cbm_radio_expectation ($certainty, $enabled=null, $checked=null) |
|
| get_contains_checkbox_expectation ($baseattr, $enabled, $checked) |
|
| get_contains_correct_expectation () |
|
| get_contains_corrupted_subquestion_message () |
| Returns an expectation that a string contains a corrupted subquestion message.
|
|
| get_contains_corruption_notification () |
| Returns an expectation that a string contains a corrupted question notification.
|
|
| get_contains_general_feedback_expectation ($question) |
|
| get_contains_hidden_expectation ($name, $value=null) |
|
| get_contains_hint_expectation ($hinttext) |
|
| get_contains_incorrect_expectation () |
|
| get_contains_mark_summary ($mark) |
|
| get_contains_marked_out_of_summary () |
|
| get_contains_mc_checkbox_expectation ($index, $enabled=null, $checked=null) |
|
| get_contains_mc_radio_expectation ($index, $enabled=null, $checked=null) |
|
| get_contains_num_parts_correct ($num) |
|
| get_contains_partcorrect_expectation () |
|
| get_contains_question_text_expectation ($question) |
|
| get_contains_radio_expectation ($baseattr, $enabled, $checked) |
|
| get_contains_select_expectation ($name, $choices, $selected=null, $enabled=null) |
|
| get_contains_standard_correct_combined_feedback_expectation () |
|
| get_contains_standard_incorrect_combined_feedback_expectation () |
|
| get_contains_standard_partiallycorrect_combined_feedback_expectation () |
|
| get_contains_submit_button_expectation ($enabled=null) |
| Returns an epectation that a string contains the HTML of a button with name {question-attempt prefix}-submit, and eiter enabled or not.
|
|
| get_contains_tf_false_radio_expectation ($enabled=null, $checked=null) |
|
| get_contains_tf_true_radio_expectation ($enabled=null, $checked=null) |
|
| get_contains_try_again_button_expectation ($enabled=null) |
|
| get_contains_validation_error_expectation () |
|
| get_does_not_contain_correctness_expectation () |
|
| get_does_not_contain_feedback_expectation () |
|
| get_does_not_contain_hidden_expectation ($name, $value=null) |
|
| get_does_not_contain_mark_summary () |
|
| get_does_not_contain_num_parts_correct () |
|
| get_does_not_contain_specific_feedback_expectation () |
|
| get_does_not_contain_submit_button_expectation () |
| Returns an epectation that a string does not contain the HTML of a button with name {question-attempt prefix}-submit.
|
|
| get_does_not_contain_try_again_button_expectation () |
|
| get_does_not_contain_validation_error_expectation () |
|
| get_invalid_answer_expectation () |
|
| get_mc_right_answer_index ($mc) |
|
| get_no_hint_visible_expectation () |
|
| get_question_attempt () |
|
| get_step ($stepnum) |
|
| get_step_count () |
|
| get_tag_matcher ($tag, $attributes) |
|
| get_tries_remaining_expectation ($n) |
|
| load_quba (moodle_database $db=null) |
|
| loadDataSet () |
|
| manual_grade ($comment, $mark, $commentformat=null) |
|
| process_autosave ($data) |
|
| process_submission ($data) |
|
| render () |
| Generate the HTML rendering of the question in its current state in $this->currentoutput so that it can be verified.
|
|
| response_data_to_post ($data) |
| Convert an array of data destined for one question to the equivalent POST data.
|
|
| run_all_adhoc_tasks () |
| Run adhoc tasks.
|
|
| runAdhocTasks ($matchclass='', $matchuserid=null) |
| Run adhoc tasks, optionally matching the specified classname.
|
|
| save_quba (moodle_database $db=null) |
|
| setUp () |
|
| start_attempt_at_question ($question, $preferredbehaviour, $maxmark=null, $variant=1) |
|
| tearDown () |
|
Helper base class for question walk-through tests.
The purpose of tests that use this base class is to simulate the entire interaction of a student making an attempt at a question. Therefore, these are not really unit tests. They would more accurately be described as integration tests. However, whether they are unit tests or not, it works well to implement them in PHPUnit.
Historically, tests like this were made because Moodle did not have anything like Behat for end-to-end testing. Even though we do now have Behat, it makes sense to keep these walk-through tests. They run massively faster than Behat tests, which gives you a much faster feedback loop while doing development. They also make it quite easy to test things like regrading the attempt after the question has been edited, which would be possible but very fiddly in Behat.
Ideally, the full set of tests for the question class of a question type would be:
- A lot of unit tests for each qtype_myqtype_question class method like grade_response, is_complete_response, is_same_response, ...
- Several of these walk-through tests, to test the end-to-end interaction of a student with a question, for example with different behaviours.
- Just one Behat test, using question preview, to verify that everything is plugged together correctly and works when used through the UI.
What one would expect to see in one of these walk-through tests is:
// 1. Set up a question: $q.
// 2. A call to $this->start_attempt_at_question($q, ...); with the relevant options.
// 3. Some number of calls to $this->process_submission passing an array of simulated // POST data that matches what would be sent back be submitting a form that contains // the form fields that are output by rendering the question. This is like clicking // the 'Check' button in a question, or navigating to the next page in a quiz.
// 4. A call to $this->finish(); which is the equivalent of clicking // 'Submit all and finish' in the quiz.
// 5. After each of steps 2-4 above, one would expect to see a certain amount of // validation of the state of the question and how the question is rendered, // using methods like $this->check_current_state(), $this->check_current_output, etc.
The best way to work out how to write tests like this is probably to look at some examples in other question types or question behaviours.
In writing these tests, it is worth noting the following points:
a) The easiest mistake to make is at step 3. You need to ensure that your simulated post data actually matches what gets sent back when the question is submitted in the browser. Try checking it against the HTTP POST requests you see in your browser when the question is submitted. Some question types have a $q->prepare_simulated_post_data() method that can help with this.
b) In the past, tests like these used to contain even more repetitive code, and so they were re-factored to add the helper methods like start_attempt_at_question, process_submission, finish. That change had good effects, like reducing duplicate code. However, there were down-sides. The extra layers of indirection hide what is going on, which means these tests are harder to understand until you know what the helpers are doing. If you want an interesting exercise, take one of the walk-through tests, and inline all the helpers. This might be a good way to understand more about the question engine API. However, having made the everything-inlined code and learned from the process, you should then just throw it away.
c) The way check_current_output works is weird. When these tests were first written Moodle used SimpleTest for unit tests and check_current_output os written in a style that made sense there. When we moved to PHPUnit, a quick and dirty conversion was done. That was a pragmatic move at the time, and we just have to live with the result. Sorry. (And: don't copy that style for new things.)
- Copyright
- 2009 The Open University
- License
- http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later