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