• Sean Hammond's avatar
    Begin adding frontend tests for changing email · 7f6ee3af
    Sean Hammond authored
    Begin adding frontend tests for the new AccountController code that
    deals with the new form for changing the logged-in user's email address.
    
    I've done this as a new top-level describe() with a new way of writing
    Angular controller tests, rather than adding to the stuff already in
    account-controller-test.coffee.
    
    The aims of this way of writing tests is to make the tests easier to understand
    and modify (either to fix a broken test or to add new ones) by:
    
    - Reducing special Angular knowledge needed to understand the tests
    
    - Reducing globals (both global variables and beforeEach() functions) used in
      tests.
    
      These increase the "travel" needed to understand a given test method because
      you have to read the whole test module to understand everything that happens
      before the test runs and what all the global variables the test uses are.
    
      The aim is that reading only the test function (and not the rest of the code
      in the file) should be enough to understand the test.
    
      Similarly I shouldn't have to read and understand the whole test file to add
      a new test.
    
      Globals and beforeEach()'s also tie the tests together. For example if a
      bunch of stub services and a controller are created in beforeEach() functions
      then any new tests added to the file inherit this stubbing behaviour even
      though they may not want it or may need something else. This again makes
      changing or adding just one test harder - need to understand the whole file,
      changes made for one test may break other tests.
    
    Implementation notes:
    
    - Used a new top-level describe(), didn't want to inherit all the globals,
      beforeEach()'s and stubbing of the existing one.
    
    - Because we now have two top-level describe()s had to use a try ... catch in
      the second one to avoid creating the "h" Angular module twice.
    
    - Tried to decouple the tests from Angular as much as possible, reduce the
      amount of Angular knowledge (especially about providing and injecting
      dependencies) needed to understand the tests.
    
      Angular's $provide isn't used at all, and inject() (which I don't think can
      be removed completely) is contained in two helper functions.
    
    - Rather than a beforeEach() and global variables we use a controller()
      function that creates the AccountController and stubs for the services it
      depends on and returns an object of all of them.
    
      Tests can then call controller() and use destructuring assignment to get only
      the bits they need.
    
      Every variable used in a test method is defined in the test method
      (sometimes by calling a helper function and getting a return value).
    
    - controller() by default uses minimal stubbing, but the caller can optionally
      pass in their own object for each of the stubbed dependencies.
    7f6ee3af
Name
Last commit
Last update
h Loading commit data...
.hound.yml Loading commit data...
.jshintignore Loading commit data...
.jshintrc Loading commit data...
package.json Loading commit data...