title: how to return rejected/failure promise to through jasmine spy to an angular controller in a unit test
body: <p>I am using jasmine for testing my angular controllers.
  I am catching errors and success in the <code>.then(successCallback, errorCallback)</code>
  Although it is working fine on the bases of live functionality but am confused how to write a spy for returning an error as it is always caught in the <code>successCallback()</code></p>
  
  <p>Following is the controller :-</p>
  
  <pre><code>angular.module('myApp')
  .controller('LoginCtrl', function ($scope, $location, loginService, SessionService) {
      $scope.errorMessage = '';
  
      $scope.login = function () {
  
        var credentials = {
            email: this.email,
            password: this.password
        };
  
       SessionService.resetSession();
       var request = loginService.login(credentials);
  
       request.then(function(promise){ //successfull callback
          if (promise['status'] === 200){
               //console.log('login');
              $location.path('/afterloginpath');
          }
        },
       function(errors){  //fail call back
        //  console.log(errors);
          $location.path('/login');
       });
      };
  });
  </code></pre>
  
  <p>My test case :-</p>
  
  <pre><code>'use strict';
  
  describe('Controller: LoginCtrl', function () {
  
    // load the controller's module
    beforeEach(module('myApp'));
  
    var LoginCtrl, scope, location, login, loginReturn, session;
    var credentials = {'email': 'email@email.com', 'password': 'admin123'};
  
    // Initialize the controller and a mock scope
   beforeEach(inject(function ($controller, $rootScope, $location, _loginService_, _SessionService_) {
  
      scope = $rootScope.$new();
      LoginCtrl = $controller('LoginCtrl', {
        $scope: scope
      });
  
      location = $location;
      login = _loginService_;
      session = _SessionService_;
      scope.errorMessage = '';
      spyOn(login, "login").andCallFake(
        function(){
          return {
            then: function(response){
              response(loginReturn);
            }
          }
        }
      );
  
      spyOn(session, "setName").andCallFake(function(){
        return true;
      });
    }));
  
    it('should go to login when login fail', function () {
      loginReturn = function(){
        return{
          successfullyCallback: {throwError:true},
          failCallback: {status: 400, 'data' : {'errors' : [{"type":"invalid_data","target":"email,password"}]}}
        }
      };
  
      var wrong_creds = {email: 'wrong@email.com', password: 'wrong_password'};
      scope.email = wrong_creds.email;
      scope.password = wrong_creds.password;
  
  scope.login();
  
      expect(location.path()).toBe("/login");
      expect(scope.errorMessage).toBe('username or password combination is invalid');
    });
  
  });
  </code></pre>