я искал в течение последних дней, но я не могу приблизиться к решению. Я пытаюсь высмеять 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 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 (сетевой трафик → HTTP-запросы показывают мне, что он запрашивает сервер вместо загрузки издевающихся данных...) но он получает 403 (запрещено).
ошибка, которую я получаю по карме, такова:
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
который не определен....
как вы можете видеть, я сделал это точно так же, как Google рекомендует...
https://docs.angularjs.org/api/ngMock/service/ $ httpBackend
Другие примеры на SO или где-либо еще выглядят весьма схожими. Что я делаю не так?
да, вы должны предоставить реальные данные или, по крайней мере, вы можете предоставить прототип своих данных, потому что вы тестируете это устройство, и оно требует длины.
и удалите эту часть, потому что вы издеваетесь над ней дважды
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"}}, "");
таким образом вы убедитесь, что сообщение вызывается, но если вы по-прежнему получаете такую же ошибку, вам нужно проверить данные ответа.
$httpBackend
говорит о том, что настоящий$httpBackend
уже недоступен в данный момент. Это может произойти в приложении, которое используетangular.injector
или что-то в этом роде, а не в обычном приложении. Можете ли вы воссоздать проблему на Plunker или Jsfiddle? Кстати,myController
здесь$controller(myController, {'$scope' : scope })
не определен, но это не связано с проблемой.