|
|
(7 intermediate revisions by 3 users not shown) |
Line 1: |
Line 1: |
| {{Moodle 2.3}}Since Moodle 2.3 we are using PHP Unit framework. Writing a unit test before writing an external function will end up to be very helpful. The easiest external function is not an easy task, as you can see in [[How to contribute a web service function to core]]. When writing PHPUnit tests you will: | | {{Template:Migrated|newDocId=/docs/apis/subsystems/external/testing}} |
| * discover use cases you didn't think about.
| |
| * understand the feelings and the needs of the web service client developer.
| |
| * end up with a function usable by everybody, not only by your own client.
| |
| * reach integration way faster as you joined a proof of validity
| |
| * make the QA process a breeze
| |
| | |
| == How to run a PHPUnit test ==
| |
| you should read first the [[PHPUnit]] Moodle documentation to have a grasp of PHPUnit in Moodle.
| |
| | |
| == How to write an external function PHPUnit test ==
| |
| If it doesn't exist create a COMPONENTFOLDER/tests/externallib_test.php file.
| |
| | |
| <code php>
| |
| <?php
| |
| // This file is part of Moodle - http://moodle.org/
| |
| //
| |
| // Moodle is free software: you can redistribute it and/or modify
| |
| // it under the terms of the GNU General Public License as published by
| |
| // the Free Software Foundation, either version 3 of the License, or
| |
| // (at your option) any later version.
| |
| //
| |
| // Moodle is distributed in the hope that it will be useful,
| |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
| |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| |
| // GNU General Public License for more details.
| |
| //
| |
| // You should have received a copy of the GNU General Public License
| |
| // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
| |
| | |
| /** | |
| * COMPONENT External functions unit tests
| |
| *
| |
| * @package core_component
| |
| * @category external
| |
| * @copyright 20XX Your Name
| |
| * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
| |
| */
| |
| | |
| defined('MOODLE_INTERNAL') || die();
| |
| | |
| require_once($CFG->dirroot . '/COMPONENT/externallib.php');
| |
| | |
| class COMPONENT_external_testcase extends externallib_advanced_testcase {
| |
| | |
| /**
| |
| * Test
| |
| */
| |
| public function test_FUNCTION_NAME() {
| |
| global $USER;
| |
| | |
| $this->resetAfterTest(true);
| |
| | |
| // Set the required capabilities by the external function
| |
| $contextid = context_XXXX::instance()->id;
| |
| $roleid = $this->assignUserCapability('moodle/CAPABILITYNAME', $contextid);
| |
| | |
| $params = array(PARAM1, PARAM2, ...);
| |
| | |
| $returnvalue = COMPONENT_external::FUNCTION_NAME($params);
| |
| | |
| // Some PHPUnit assert
| |
| $this->assertEquals(EXPECTED_VALUE, RETURNED_VALUE);
| |
| | |
| // Call without required capability
| |
| $this->unassignUserCapability('moodle/CAPABILITYNAME', $contextid, $roleid);
| |
| $this->setExpectedException('required_capability_exception');
| |
| $returnvalue = COMPONENT_external::FUNCTION_NAME($params);
| |
| | |
| }
| |
| } | |
| </code>
| |
| | |
| But the quickest way is most likely to look at some example like course/tests/courseexternallib_test.php - get_categories (MDL-33995). Also read [[Writing PHPUnit tests]].
| |
| | |
| === Coding style ===
| |
| * external functions often check many capabilities. Remember to assign the correct one to the $USER and also test for exception when the $USER doesn't have them.
| |
| | |
| | |
| | |
| [[Category:Unit testing]][[Category:Web_Services]]
| |