0
我有以下服务:假冒行为
'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);
和下面的测试:
'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();
});
});
});
如何测试该财产“加载”已经改变?
此外,我怎么能测试方法得到的,查询,删除并从那里被称为resourceMock?保存时,我是间谍添加到这些方法,每个人失去他们的预期回调的执行。