2015-10-04 49 views
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?保存时,我是间谍添加到这些方法,每个人失去他们的预期回调的执行。

回答

0

我想我解决它。

添加以下行测试:

spyOn(resourceMock, 'query').and.callThrough();

威尔广告间谍的查询方法,但将离开目前的实施,儿子模拟可以正常工作,您还可以检查是否有一定方法被调用。