dimanche 5 juillet 2015

How do I mock $http response with promises and return dummy data

I am calling an API service which returns a promise from a factory.

Here is a part of my factory.

     factories.factory('OnBoardingFactory', ['$http',

        function ($http) {

          var dataFactory = {};

          dataFactory.get = function (url) {
            return $http.get('http://localhost/api/onboarding/' + url)
          };

          return dataFactory
        }

     ]);

And here is where its called from the controller:

OnBoardingFactory.get('login?username=test&password=password')
   .then(function(response){
      $scope.response = response.status;
   })

This returns data in the controller absolutely fine. However I have difficulties when I come to test it. Here is my test script:

var scope, FakeOnBoardingFactory, controller, q, deferred;

beforeEach(module('app.module'));

beforeEach(function () {
  FakeOnBoardingFactory = {
    get: function () {
      deferred = q.defer();
      // Place the fake return object here
      deferred.resolve({ response: {status: 200}});
      return deferred.promise;
    }
  };
  spyOn(FakeOnBoardingFactory, 'get').and.callThrough();
});

beforeEach(inject(function ($q, $rootScope, $controller, $injector ) {

  scope = $rootScope.$new();
  q = $q;

  controller = $controller(OnBoardingCtrl, {
    $scope: scope,
    OnBoardingFactory: FakeOnBoardingFactory
  })

}));

it('Should call the form and return 200', function () {

  // Execute form
  scope.loginCredentials({$valid: true});

  scope.$apply();

  // Ensure script is called (which passes fine)
  expect(FakeOnBoardingFactory.get).toHaveBeenCalled();

  scope.$apply();

  // BREAKS HERE
  expect(scope.status).toBe(200);

})

When expect(FakeOnBoardingFactory.get).toHaveBeenCalled(); is called, this passes fine. However then I run expect(scope.status).toBe(200), it breaks "Expected undefined to be 200".

This would indicate that my FakeOnBoardingFactory isn't returning any data. But I can't seem to find the issue.

Aucun commentaire:

Enregistrer un commentaire