Angularjs $httpBackend导致测试失败,并带有;“不需要更多请求”;
在重构单元测试依赖项的过程中,我在大约200个依赖于$httpBackend的angular Mock的测试中遇到了这个错误,导致它们失败。我查看了调用堆栈,似乎$httpBackend.flush()在尝试尝试attemptSync时导致调用失败 下面是失败的测试的样子,这是错误的样子: 测试失败:Angularjs $httpBackend导致测试失败,并带有;“不需要更多请求”;,angularjs,unit-testing,jasmine,karma-jasmine,Angularjs,Unit Testing,Jasmine,Karma Jasmine,在重构单元测试依赖项的过程中,我在大约200个依赖于$httpBackend的angular Mock的测试中遇到了这个错误,导致它们失败。我查看了调用堆栈,似乎$httpBackend.flush()在尝试尝试attemptSync时导致调用失败 下面是失败的测试的样子,这是错误的样子: 测试失败: fdescribe('UserPanelSettingsCtrl', function() { var $q, userPanelSettingsCtrl, scope, $httpBack
fdescribe('UserPanelSettingsCtrl', function() {
var $q, userPanelSettingsCtrl, scope, $httpBackend, WEBAPI_URL, MDAPI_URL, jstz;
beforeEach(function() {
module('config');
module('Core');
module('utils');
});
beforeEach(function() {
inject(function(_$q_, _$controller_, _$httpBackend_, _WEBAPI_URL_, _MDAPI_URL_, _$rootScope_, _jstz_) {
$q = _$q_;
scope = _$rootScope_.$new();
$httpBackend = _$httpBackend_;
WEBAPI_URL = _WEBAPI_URL_;
MDAPI_URL = _MDAPI_URL_;
jstz = _jstz_;
userPanelSettingsCtrl = _$controller_('UserPanelSettingsCtrl', {
$scope: scope,
user: {'profile':{'workgroups':{}}},
jstz: jstz
});
});
});
beforeEach(function(){
$httpBackend.expectGET(WEBAPI_URL + 'v1/users/me/settings/webui').respond({});
$httpBackend.expectGET(MDAPI_URL + "v1/list/Mapped%20Megacomponent").respond([{id:1,name:'3D'}]);
$httpBackend.expectGET(MDAPI_URL + "v1/list/Mapped%20Component").respond([{id:1,name:'D3D'}]);
});
afterEach(function(){
angular.element('.toast').remove();
});
it('should load user settings and profile data from API ', function() {
$httpBackend.flush();
expect(scope.loading).toBe(false);
expect(scope.verticals[0].id).toEqual(1);
expect(scope.components[0].id).toEqual(1);
});
it('should save profile data to the API ', function() {
var deferred = $q.defer();
deferred.resolve();
scope.user.updateWorkgroups = function(){ return deferred.promise; };
scope.saveUserProfile({});
$httpBackend.expectGET(WEBAPI_URL + 'v2/users/me').respond({});
$httpBackend.expectPUT(WEBAPI_URL + 'v1/users/me/settings/webui').respond({});
$httpBackend.flush();
scope.$digest();
expect(angular.element('.toast')).toBeDefined();
expect(angular.element('.toast-message').text()).toEqual('User profile updated');
});`
这就是错误的样子:
Chrome 67.0.3396 (Windows) UserPanelSettingsCtrl should load user settings and profile data from API FAILED
Error: Unexpected request: GET /api/web/v2/users/me
No more request expected
at $httpBackend (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular-mocks/angular-mocks.js:1419:9)
at sendReq (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:12027:9)
at serverRequest (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:11822:16)
at processQueue (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:16696:28)
at C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:16712:27
at Scope.$eval (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:17994:28)
at Scope.$digest (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:17808:31)
at Scope.$apply (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:18102:24)
at done (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular/angular.js:12082:47)
at Array.handleResponse (C:/Users/usr/Desktop/Karma Work - Copy/src/webui/public/bower_components/angular-mocks/angular-mocks.js:1369:9)
我不知道如何着手解决这个问题,我试着通过电话,但我无法缩小问题的范围。可能是一个依赖关系问题,因为我一直在更改依赖关系所在位置的文件结构,并且可能在构建应用程序的grunt文件中遗漏了一些内容。在调用
saveUserProfile
后,您希望得到GET
,该文件使用/api/web/v2/user/me
url调用api。因此,向上移动$httpBackend.expectGET
,如下所示
it('should save profile data to the API ', function() {
$httpBackend.expectGET(WEBAPI_URL + 'v2/users/me').respond({});
$httpBackend.expectPUT(WEBAPI_URL + 'v1/users/me/settings/webui').respond({});
var deferred = $q.defer();
deferred.resolve();
scope.user.updateWorkgroups = function(){ return deferred.promise; };
scope.saveUserProfile({});
$httpBackend.flush();
scope.$digest();
expect(angular.element('.toast')).toBeDefined();
expect(angular.element('.toast-message').text()).toEqual('User profile updated');
});
错误是说,在应用程序运行期间,对
/api/web/v2/user/me
发出了一个HTTP调用,但您没有为它定义一个模拟,根据您的测试,这是正确的。在您定义的三个测试中,没有一个是to/api/web/v2/user/me
忘记在其中添加测试,它现在在那里尝试重新排序api调用,仍然没有得到任何错误更改