-
Bug
-
Resolution: Won't Fix
-
Major
-
None
-
2.0
-
None
-
MOODLE_20_STABLE
Gradebook Unit tests are currently using a set of test database tables, which are initialised before and stripped down after each test (over 300 of them). This is clunky, prone to inconsistencies with current code and DB schema, and extremely slow (tests complete at around 150 seconds).
Proper unit testing should use mock objects and partial mocks, to isolate the methods being tested without getting into deep levels of external libraries and databases. The gradebook code is mostly ready for such tests, but a number of design choices make it impossible for complex methods. These include static method calls that eventually call on external library methods (especially database access methods); and calls to global functions (such as dmllib functions) which cannot be mocked.
The proposed change is to :
1. implement a singleton method within the grade_object method (get_instance), which can be used to access a class-wide static instance of each of the 5 gradebook classes when static methods need to be called on them (such as fetch and fetch_all).
2. implement a lib_wrapper class which is defines methods with the same names and signatures as the global functions used by the gradebook classes, but which call these global functions directly. The gradebook classes, instead of calling the global functions themselves (get_records(...)), instantiate the lib_wrapper object and call its equivalent method. This makes it possible to use a mock lib_wrapper in the unit tests.