我一直在寻找最后几天,但我无法接近解决方案。我尝试模拟角度控制器请求的http响应。
角度控制器:
myController = function ($http, appConfig) {
$http.post(appConfig.restPath+"/administration/imports", {
}).then(function(data){
$scope.pagination = data;
$scope.totalItems = data.data.content.length;
$scope.totalPages = data.data.totalPages;
$scope.pages = [];
$scope.imports = data.data;
for (var i = 0; i < $scope.totalPages; i++){
$scope.pages.push(i);
}
});
}
和测试:
describe('Controller: myController', function() {
// load the controller's module
beforeEach(module("myModule"));
var controller,
scope, httpBackend, myPost;
// Initialize the controller and a mock scope
beforeEach(inject(function ($injector) {
httpBackend = $injector.get('$httpBackend');
myPost = httpBackend.whenPOST('http://localhost:9000/api/v1/administration/imports').respond({data: {content: ["a", "b"], totalPages: "1"}}, "");
scope = $injector.get('$rootScope');
var $controller = $injector.get('$controller');
createController = function() {
return $controller(myController, {'$scope' : scope });
};
}));
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('should browse the list of imported files', function() {
httpBackend.expectPOST('http://localhost:9000/api/v1/administration/imports');
var controller = createController();
httpBackend.flush();
});
});
但是,当我在Chrome控制台中检查测试时,他似乎想要询问服务器的真实数据(网络流量 - &gt; HTTP请求告诉我,他正在请求服务器而不是加载模拟数据。 ..),但他收到403(禁止)。
karma收到的错误如下:
TypeError: Cannot read property 'length' of undefined at myController.js:35:40
第35行是:
$scope.totalItems = data.data.content.length;
这让我觉得他试图从REST服务加载数据,接收403,空结果(意味着data == {}
),然后他试图访问未定义的data.data.content.length
...
你可以看到我完全像谷歌推荐的那样......
https://docs.angularjs.org/api/ngMock/service/ $ httpBackend
SO或其他任何地方的其他示例看起来非常相似。我做错了什么?
答案 0 :(得分:0)
是的,您必须提供真实数据,或者至少您可以提供数据原型,因为您正在测试该单位并且需要很长时间。
并删除此部分,因为您正在嘲笑它两次
httpBackend.expectPOST('http://localhost:9000/api/v1/administration/imports');
使用
myPost = httpBackend.expectPOST('http://localhost:9000/api/v1/administration/imports').respond({data: {content: ["a", "b"], totalPages: "1"}}, "");
通过这种方式,您可以确保调用帖子,但如果仍然出现相同的错误,则必须检查回复数据。