Javascript Karma Jasmine:意外请求:获取。。。不需要更多的请求
情况:Javascript Karma Jasmine:意外请求:获取。。。不需要更多的请求,javascript,angularjs,unit-testing,karma-runner,karma-jasmine,Javascript,Angularjs,Unit Testing,Karma Runner,Karma Jasmine,情况: .controller('TestController', function($scope, $http, $timeout) { $scope.getLanguageList = function() { $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) { $scope.language_list = resp.data;
.controller('TestController', function($scope, $http, $timeout) {
$scope.getLanguageList = function()
{
$http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp)
{
$scope.language_list = resp.data;
},
function(err)
{
$scope.language_list = [];
})
}
$scope.language_list = [];
$scope.getLanguageList();
$scope.get_project_list = function()
{
$http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp)
{
$scope.project_list = resp.data;
},
function(err)
{
$scope.project_list = [];
})
}
$scope.project_list = [];
$scope.get_project_list();
})
describe('Http requests tests', function() {
beforeEach(module('my_app.controllers'));
var $controller;
var $httpBackend;
var $scope;
var $timeout;
describe('Lists test', function()
{
beforeEach(angular.mock.http.init);
afterEach(angular.mock.http.reset);
beforeEach(inject(function(_$controller_, _$httpBackend_)
{
$controller = _$controller_;
$scope = {};
$httpBackend = _$httpBackend_;
}));
it('should load default language list', function (done)
{
$httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.language_list).not.toEqual([]);
done();
}, 1000);
});
it('should load default project list', function (done)
{
$httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.project_list).not.toEqual([]);
done();
}, 1000);
});
});
});
我正在AngularJs应用程序中测试两个不同的http调用
有一种奇怪的行为。如果我单独测试每一个,并且另一个临时注释掉(在控制器和测试中),那么每个都可以正常工作,并且测试通过
但如果我在两个测试都存在的情况下运行karma,它们就会失败,并给出以下错误消息:
Unexpected request: GET https://MY_DOMAIN_2.com/list_project
No more request expected
控制器:
.controller('TestController', function($scope, $http, $timeout) {
$scope.getLanguageList = function()
{
$http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp)
{
$scope.language_list = resp.data;
},
function(err)
{
$scope.language_list = [];
})
}
$scope.language_list = [];
$scope.getLanguageList();
$scope.get_project_list = function()
{
$http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp)
{
$scope.project_list = resp.data;
},
function(err)
{
$scope.project_list = [];
})
}
$scope.project_list = [];
$scope.get_project_list();
})
describe('Http requests tests', function() {
beforeEach(module('my_app.controllers'));
var $controller;
var $httpBackend;
var $scope;
var $timeout;
describe('Lists test', function()
{
beforeEach(angular.mock.http.init);
afterEach(angular.mock.http.reset);
beforeEach(inject(function(_$controller_, _$httpBackend_)
{
$controller = _$controller_;
$scope = {};
$httpBackend = _$httpBackend_;
}));
it('should load default language list', function (done)
{
$httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.language_list).not.toEqual([]);
done();
}, 1000);
});
it('should load default project list', function (done)
{
$httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.project_list).not.toEqual([]);
done();
}, 1000);
});
});
});
测试:
.controller('TestController', function($scope, $http, $timeout) {
$scope.getLanguageList = function()
{
$http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp)
{
$scope.language_list = resp.data;
},
function(err)
{
$scope.language_list = [];
})
}
$scope.language_list = [];
$scope.getLanguageList();
$scope.get_project_list = function()
{
$http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp)
{
$scope.project_list = resp.data;
},
function(err)
{
$scope.project_list = [];
})
}
$scope.project_list = [];
$scope.get_project_list();
})
describe('Http requests tests', function() {
beforeEach(module('my_app.controllers'));
var $controller;
var $httpBackend;
var $scope;
var $timeout;
describe('Lists test', function()
{
beforeEach(angular.mock.http.init);
afterEach(angular.mock.http.reset);
beforeEach(inject(function(_$controller_, _$httpBackend_)
{
$controller = _$controller_;
$scope = {};
$httpBackend = _$httpBackend_;
}));
it('should load default language list', function (done)
{
$httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.language_list).not.toEqual([]);
done();
}, 1000);
});
it('should load default project list', function (done)
{
$httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.project_list).not.toEqual([]);
done();
}, 1000);
});
});
});
问题:
.controller('TestController', function($scope, $http, $timeout) {
$scope.getLanguageList = function()
{
$http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp)
{
$scope.language_list = resp.data;
},
function(err)
{
$scope.language_list = [];
})
}
$scope.language_list = [];
$scope.getLanguageList();
$scope.get_project_list = function()
{
$http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp)
{
$scope.project_list = resp.data;
},
function(err)
{
$scope.project_list = [];
})
}
$scope.project_list = [];
$scope.get_project_list();
})
describe('Http requests tests', function() {
beforeEach(module('my_app.controllers'));
var $controller;
var $httpBackend;
var $scope;
var $timeout;
describe('Lists test', function()
{
beforeEach(angular.mock.http.init);
afterEach(angular.mock.http.reset);
beforeEach(inject(function(_$controller_, _$httpBackend_)
{
$controller = _$controller_;
$scope = {};
$httpBackend = _$httpBackend_;
}));
it('should load default language list', function (done)
{
$httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.language_list).not.toEqual([]);
done();
}, 1000);
});
it('should load default project list', function (done)
{
$httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
setTimeout(function()
{
expect($scope.project_list).not.toEqual([]);
done();
}, 1000);
});
});
});
为什么我会收到那个错误消息?
代码应该很好,因为它们单独工作时很好。我错过什么了吗
谢谢大家! 不要使用超时,同时测试它们:
it('should load default language list and the default project list', function (){
$httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
$httpBackend.whenGET('httpS://MY_DOMAIN_2.org/projectList').passThrough();
var TestController = $controller('TestController', { $scope: $scope });
$httpBackend.flush();
expect($scope.language_list).not.toEqual([]);
expect($scope.project_list).not.toEqual([]);
});
这里有一些提示和演示
- 您应该使用
,而不是$httpBackend.flush()
。通过这种方式,您可以控制异步请求何时返回。它使测试更容易setTimeout()
- 将$httpBackend和控制器拉出到beforeach语句中。创建控制器时,它会同时触发两个url。然后你可以单独评估它。当它在
语句中被隔离时,它不会调用另一个$http并抛出意外的url错误it
- 您还应该模拟$http请求的响应,而不是传递。您并不总是能够连接到internet,并且响应可能会发生变化。因此,让模拟数据看起来像您期望的那样
- 此外,
请求的url不正确。它应该是小写的$httpBackend.whenGET('httpS://MY\u DOMAIN\u 2.org/projectList')
和s
url。这是因为控制器正在请求 $http.get(“”).com
.com
,因为您在控制器中调用了.com
<代码>$http.get('https://MY_DOMAIN_2.com/projectList)。然后(函数(resp)