AngularJS Service Jasmine 单元测试未刷新请求错误
AngularJS Service Jasmine Unit Test Unflushed Request Error
我正在编写我的第一个单元测试来检查 AngularJS 服务的功能。这是我正在测试的具有 getList
功能的服务的一部分:
(function() {
'use strict';
angular
.module('app.services')
.factory('RestService', RestService);
RestService.$inject = [ '$http' ];
function RestService($http) {
var service = {
getList: getList,
...
};
return service;
function getList(url) {
return $http.get(url)
.then(function(response) {
console.log('RestService: got list: ' + response.data.length);
return response.data;
})
.catch(function(errResponse) {
console.error('RestService: error getting list: ' + errResponse.status);
});
}
并且我编写了以下单元测试:
'use strict';
describe('Test Rest Service', function() {
var httpBackend;
var RestService;
var reqHandler;
beforeEach(module('app.services'));
beforeEach(inject(function ($httpBackend, _RestService_) {
httpBackend = $httpBackend;
RestService = _RestService_;
reqHandler = httpBackend.when('GET', '/api/events')
.respond(200, '[{ "event": 1 }, { "event": 2 }]');
}));
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('should get a list of events', function() {
var url = '/api/events';
httpBackend.expectGET(url);
RestService.getList(url).then(function(response) {
httpBackend.flush();
expect(response.length).toEqual(2);
});
});
});
当我 运行 测试时,我得到以下错误:
Test Rest Service
PhantomJS 1.9.8 (Windows 8 0.0.0) Test Rest Service "after each" hook FAILED
Error: Unflushed requests: 1
我的第一个猜测是 then
部分测试没有执行,但我找不到检查它的方法。谁能解释为什么我有一个未完成的请求?另外,有什么方法可以逐步完成测试,或者至少将变量打印到屏幕上,这样我就可以弄清楚发生了什么?
提前致谢!
httpBackend.flush 是函数,它导致来自 httpBackend 的 return 数据。
你不能在 then 块中调用它,因为 then 在接收到数据时被调用(在这种情况下永远不会)。
正确的测试代码是
it('should get a list of events', function() {
var url = '/api/events';
httpBackend.expectGET(url);
RestService.getList(url).then(function(response) {
expect(response.length).toEqual(2);
});
httpBackend.flush();
});
我正在编写我的第一个单元测试来检查 AngularJS 服务的功能。这是我正在测试的具有 getList
功能的服务的一部分:
(function() {
'use strict';
angular
.module('app.services')
.factory('RestService', RestService);
RestService.$inject = [ '$http' ];
function RestService($http) {
var service = {
getList: getList,
...
};
return service;
function getList(url) {
return $http.get(url)
.then(function(response) {
console.log('RestService: got list: ' + response.data.length);
return response.data;
})
.catch(function(errResponse) {
console.error('RestService: error getting list: ' + errResponse.status);
});
}
并且我编写了以下单元测试:
'use strict';
describe('Test Rest Service', function() {
var httpBackend;
var RestService;
var reqHandler;
beforeEach(module('app.services'));
beforeEach(inject(function ($httpBackend, _RestService_) {
httpBackend = $httpBackend;
RestService = _RestService_;
reqHandler = httpBackend.when('GET', '/api/events')
.respond(200, '[{ "event": 1 }, { "event": 2 }]');
}));
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('should get a list of events', function() {
var url = '/api/events';
httpBackend.expectGET(url);
RestService.getList(url).then(function(response) {
httpBackend.flush();
expect(response.length).toEqual(2);
});
});
});
当我 运行 测试时,我得到以下错误:
Test Rest Service
PhantomJS 1.9.8 (Windows 8 0.0.0) Test Rest Service "after each" hook FAILED
Error: Unflushed requests: 1
我的第一个猜测是 then
部分测试没有执行,但我找不到检查它的方法。谁能解释为什么我有一个未完成的请求?另外,有什么方法可以逐步完成测试,或者至少将变量打印到屏幕上,这样我就可以弄清楚发生了什么?
提前致谢!
httpBackend.flush 是函数,它导致来自 httpBackend 的 return 数据。 你不能在 then 块中调用它,因为 then 在接收到数据时被调用(在这种情况下永远不会)。
正确的测试代码是
it('should get a list of events', function() {
var url = '/api/events';
httpBackend.expectGET(url);
RestService.getList(url).then(function(response) {
expect(response.length).toEqual(2);
});
httpBackend.flush();
});