mardi 14 avril 2015

Trying to supply a promise to a service for an AngularJS unit test

I'm trying to unit test a factory:



angular.module('app.user').factory('UserService',
['RESTService', 'RESTHTTPService',
function(RESTService, RESTHTTPService) {
var factory = {};

factory.all = function(page, size, sort, callback) {
return RESTService.User.get({page: page, size: size, sort: sort}).$promise.then(callback);
};

return factory;
}
]);


So I needed to mock its RESTService dependency.



angular.module('app.user.mock').factory('RESTService',
['$q',
function($q) {
var factory = { User: {} };

factory.allUsers = {
content: [ { firstname: 'Spirou', lastname: 'Fantasio', email: 'spirou@yahoo.se', workPhone: '983743464365' } ],
page: '1'
};

factory.User.get = function() {
var defer = $q.defer();
defer.resolve(this.allUsers);
return defer;
};

return factory;
}
]);


To be used in my unit test:



describe('user service repository', function() {

beforeEach(function() {
module('com.nsn.nitro.project');
module('app.user.mock');
});

var UserService;
var RESTService;

beforeEach(inject(function(_UserService_, _RESTService_) {
UserService = _UserService_;
RESTService = _RESTService_;
}));

it('should return the list of users', function () {
var users = null;
UserService.all(1, 10, 'asc', function(data) {
users = data.content;
});
expect(users).toEqual(RESTService.allUsers.content);
});

});


But it gives me the error:



TypeError: Cannot read property 'then' of undefined
at Object.factory.all (/home/stephane/dev/js/projects/angularjs/nitro-project/app/modules/user/service/repository.js:29:81)
at null.<anonymous> (/home/stephane/dev/js/projects/angularjs/nitro-project/test/spec/modules/user/service.js:59:17)


The mocked RESTService is injected fine in the UserService but the promise property, or rather the $promise property, is undefined.


As the code works fine in production, I would like not to touch the existing UserService and RESTService factories. If possible.


Aucun commentaire:

Enregistrer un commentaire