我是AngularJS的新手,遇到了单元测试的一些问题。我已经看过无数个模拟$ httpBackend调用的例子,但是当我这样做时它将无法工作,除非我还包含$ rootScope。$ apply()。
我的服务:
angular.module('myApp.services', ['ngResource'])
.factory('TestingService', ['$resource', function($resource) {
return $resource('/api/v1/values', {}, {
getValues: {
method: 'GET'
}
});
}]);
我的单元测试:
describe('Testing services', function() {
beforeEach(module('myApp.services'));
afterEach(function() {
inject(function($httpBackend) {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
});
describe('TestingService', function() {
it('would be nice to get an explanation for this',
inject(['$rootScope', '$httpBackend', 'TestingService',
function ($rootScope, $httpBackend, testingService) {
$httpBackend.expectGET('/api/v1/values').respond(100);
var result = testingService.getValues();
//$rootScope.$apply();
$httpBackend.flush();
expect(result).toBe(100);
alert(result);
}])
);
});
});
当Karma像这样运行测试时,我得到:
Error: No pending request to flush !
Error: Unsatisfied requests: GET /api/v1/values
如果我包含$ rootScope。$ apply();我会得到这个(当然警报也打印出一个$ promise):
Expected { $promise : { then : Function, catch : Function, finally : Function }, $resolved : true } to be 100.
任何人都可以解释为什么我需要“$ rootScope。$ apply();”通过expectGET? 为什么响应是一个承诺而不是我指定的模拟响应?
答案 0 :(得分:2)
一些睡眠后发现问题。简单的一个幸运的是。
我使用的是Angular版本1.3.0-beta.2,但有一个旧版本的角度模拟。更新版本不需要" $ root。$ apply();"。
更新的工作测试:
describe('Testing services', function() {
beforeEach(function(){
module('myApp.services');
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
afterEach(function() {
inject(function($httpBackend) {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
});
describe('TestingService', function() {
it('should work',
inject(['$rootScope', '$httpBackend', 'TestingService',
function ($rootScope, $httpBackend, testingService) {
$httpBackend.expectGET('/api/v1/values').respond( { key: 'value' } );
var result = testingService.getValues();
$httpBackend.flush();
expect(result).toEqualData( { key: 'value' } );
alert(angular.toJson(result, true));
}])
);
});
});