HTTP Jasmine / Karma не смоделирован как ожидалось (Angular Controller при вызове REST)

0

я искал в течение последних дней, но я не могу приблизиться к решению. Я пытаюсь высмеять 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 или где-либо еще выглядят весьма схожими. Что я делаю не так?

  • 0
    Непонятно, как это происходит, потому что реальные запросы не должны выполняться в модульных тестах, тот факт, что у вас есть доступ к $httpBackend говорит о том, что настоящий $httpBackend уже недоступен в данный момент. Это может произойти в приложении, которое использует angular.injector или что-то в этом роде, а не в обычном приложении. Можете ли вы воссоздать проблему на Plunker или Jsfiddle? Кстати, myController здесь $controller(myController, {'$scope' : scope }) не определен, но это не связано с проблемой.
  • 0
    я не могу заставить скрипку работать, брат ... jsfiddle.net/E64Se/106
Показать ещё 4 комментария
Теги:
unit-testing
karma-jasmine
rest

1 ответ

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"}}, "");

таким образом вы убедитесь, что сообщение вызывается, но если вы по-прежнему получаете такую же ошибку, вам нужно проверить данные ответа.

  • 0
    и как я могу этого достичь? Как я могу дать карма тестам разрешение на доступ к базе данных? или как я могу настроить этот прототип?
  • 0
    проверить обновленный ответ
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню