【发布时间】:2015-08-02 12:07:21
【问题描述】:
我正在编写我的第一个单元测试来检查 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 部分测试没有执行,但我找不到检查方法。谁能解释为什么我有一个未刷新的请求?另外,有什么方法可以让我逐步完成测试,或者至少将变量打印到屏幕上,这样我就可以弄清楚发生了什么?
提前致谢!
【问题讨论】:
-
我知道
$scope.$digest()会刷新承诺,所以我会尝试:var res = RestService.getList(url); $scope.$digest(); res.then(...);。这样,您也可以 console.log 到res看看是否有效。 -
我已经尝试过你的建议,但我仍然会遇到同样的错误。我在
beforeEach中注入了作用域,就像var root = $injector.get('$rootScope'); scope = root.$new();一样,然后更改了测试var res = RestService.getList(url); scope.$digest(); res.then(function() { httpBackend.flush(); expect(res.length).toEqual(2); });。希望我可以打印到代码正在执行的控制台吗?
标签: angularjs unit-testing jasmine gulp karma-jasmine