I have the following service:
'use strict';
var app = angular.module('ns.simple-resource', []);
function simpleResource ($q) {
this.resource;
this.loading;
this.list;
this.element;
this.cget = function (query) {
var deferred = $q.defer();
if (!this.resource) {
deferred.reject('Resource is not defined');
return;
}
var self = this;
self.loading = true;
this.resource.query(query, function (list) {
self.list = list;
self.loading = false;
deferred.resolve(list);
}, function () {
self.loading = false;
deferred.reject('server error');
});
return deferred.promise;
};
this.get = function (params) {
var deferred = $q.defer();
if (!this.resource) {
deferred.reject('Resource is not defined');
return;
}
var self = this;
self.loading = true;
this.resource.get(params, function (element) {
self.element = element;
self.loading = false;
deferred.resolve(element);
}, function () {
self.loading = false;
deferred.reject('server error');
});
return deferred.promise;
};
this.save = function (params) {
var deferred = $q.defer();
if (!this.resource) {
deferred.reject('Resource is not defined');
return;
}
var self = this;
self.loading = true;
this.resource.save(params, function () {
self.loading = false;
deferred.resolve();
}, function () {
self.loading = false;
deferred.reject('server error');
});
return deferred.promise;
};
this.delete = function (params) {
var deferred = $q.defer();
if (!this.resource) {
deferred.reject('Resource is not defined');
return;
}
var self = this;
self.loading = true;
this.resource.delete(params, function () {
self.loading = false;
deferred.resolve();
}, function () {
self.loading = false;
deferred.reject('server error');
});
return deferred.promise;
};
}
app
.service('nsResource', simpleResource);
and the following test:
'use strict';
var nsResource, child, mockQ = {}, deferred, resourceMock = {};
var list = [
{id: 1, name: 'John'},
{id: 2, name: 'Peter'},
{id: 3, name: 'Juan'}
];
var element = {id: 1, name: 'John'};
describe('simple-resource.js', function () {
// load the service's module
beforeEach(module('ns.simple-resource'));
// instantiate service
beforeEach(function () {
deferred = jasmine.createSpyObj('deferred', ['resolve', 'reject']);
deferred.promise = 'Promise';
mockQ.defer = function () {
return deferred;
};
nsResource = new simpleResource(mockQ);
resourceMock = {
error: false,
query: function (query, cb, err) {
if (!this.error) {cb(list);}else{err();}
},
get: function (params, cb, err) {
if (!this.error) {cb(element);}else{err();}
},
save: function (params, cb, err) {
if (!this.error) {cb(element);}else{err();}
},
delete: function (params, cb, err) {
if (!this.error) {cb(element);}else{err();}
}
};
child = {
cget: function () {
return nsResource.cget.apply(this, arguments);
},
get: function () {
return nsResource.get.apply(this, arguments);
},
save: function () {
return nsResource.save.apply(this, arguments);
},
delete: function () {
return nsResource.delete.apply(this, arguments);
}
};
});
// mock child service
describe('Method: CGET', function () {
it('returns a promise when resource is defined', function () {
child.resource = resourceMock;
expect(child.cget()).toBe('Promise');
});
it('rejects the promise on undefined resource', function () {
child.cget();
expect(deferred.reject).toHaveBeenCalled();
});
it('populates list attribute', function () {
child.resource = resourceMock;
child.cget();
expect(child.list.length).toBe(3);
});
it('reject promise on server error', function () {
resourceMock.error = true;
child.resource = resourceMock;
child.cget();
expect(deferred.reject).toHaveBeenCalled();
});
});
describe('Method: GET', function () {
it('returns a promise when resource is defined', function () {
child.resource = resourceMock;
expect(child.get()).toBe('Promise');
expect(child.element).toEqual(element);
});
it('reject the promise on undefined resource', function () {
child.get();
expect(deferred.reject).toHaveBeenCalled();
});
it('populates element attribute', function () {
child.resource = resourceMock;
child.get();
expect(Object.keys(child.element).length > 0).toBe(true);
});
it('reject promise on server error', function () {
resourceMock.error = true;
child.resource = resourceMock;
child.get();
expect(deferred.reject).toHaveBeenCalled();
});
});
describe('Method: SAVE', function () {
it('returns a promise when resource is defined', function () {
child.resource = resourceMock;
expect(child.save()).toBe('Promise');
expect(deferred.resolve).toHaveBeenCalled();
});
it('reject the promise on undefined resource', function () {
child.save();
expect(deferred.reject).toHaveBeenCalled();
});
it('reject promise on server error', function () {
resourceMock.error = true;
child.resource = resourceMock;
child.save();
expect(deferred.reject).toHaveBeenCalled();
});
});
describe('Method: DELETE', function () {
it('returns a promise when resource is defined', function () {
child.resource = resourceMock;
expect(child.delete()).toBe('Promise');
expect(deferred.resolve).toHaveBeenCalled();
});
it('reject the promise on undefined resource', function () {
child.delete();
expect(deferred.reject).toHaveBeenCalled();
});
it('reject promise on server error', function () {
resourceMock.error = true;
child.resource = resourceMock;
child.delete();
expect(deferred.reject).toHaveBeenCalled();
});
});
});
How can i test that the property "loading" has changed?
Also, how can i test that the method get, query, delete and save from the resourceMock where called?, when i add a spy to those methods, each one lose their expected callback execution.
Aucun commentaire:
Enregistrer un commentaire