我正在尝试开始为我的角度应用程序编写单元测试,并且由于无法确定如何以一种可测试的方式模拟服务而非常快地遇到了一个障碍。 有没有一种方法可以模拟REST调用,否则好像我需要在测试中镜像服务中的所有内容,这对我来说似乎不对,但是我对测试写作相当陌生,所以也许应该这样有待完成。任何帮助将不胜感激。
我的服务如下:
angular.module('resources.users', ['ngResource']) .factory('User', function($resource) { var resource = $resource('/api/index.php/users/:username', {}, { 'update': {method: 'PUT'} }); resource.getUser = function(username, successCb) { return resource.query({username: username}, successCb); }; return resource; });
到目前为止,我的测试包括:
describe('User', function() { var mockUserResource; beforeEach(module('resources.users')); beforeEach(function() { mockUserResource = sinon.stub({ getUser: function(username) { mockUserResource.query({username: username}); }, query: function() {} }); module(function($provide) { $provide.value('User', mockUserResource); }) }); describe('getUser', function() { it('should call getUser with username', inject(function(User) { User.getUser('test'); expect(mockUserResource.query.args[0][0]).toEqual({username: 'test'}); })); }) });
您可以像这样模拟ngResource发出的请求:
describe('User', function () { var mockUserResource, $httpBackend; beforeEach(angular.mock.module('myApp')); beforeEach(function () { angular.mock.inject(function ($injector) { $httpBackend = $injector.get('$httpBackend'); mockUserResource = $injector.get('User'); }) }); describe('getUser', function () { it('should call getUser with username', inject(function (User) { $httpBackend.expectGET('/api/index.php/users/test') .respond([{ username: 'test' }]); var result = mockUserResource.getUser('test'); $httpBackend.flush(); expect(result[0].username).toEqual('test'); })); }); });
**[Demo](http://jsfiddle.net/8FRBS/)**