2016-08-04 1 views
0

Я искал последние дни, но не могу приблизиться к решению. Я пытаюсь высмеять HTTP-запрос, запрошенный угловым контроллером.Жасмин/Карма HTTP не высмеивается, как ожидалось (Угловой контроллер при вызове REST) ​​

угловой контроллер:

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(); 

}); 
}); 

Но, кажется, что он хочет спросить сервер для реальных данных, когда я проверить тест на хромированной консоли (сеть трафик -> 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

Непонятно, как это происходит, потому что настоящие запросы не должны выполняться в модульных тестах, тот факт, что у вас есть доступ к mocked '$ httpBackend', говорит о том, что настоящий' $ httpBackend' уже недоступен в данный момент. Это может произойти в приложении, которое неправильно использует «angular.injector» или что-то в этом роде, а не в обычном приложении. Можете ли вы воссоздать проблему на Plunker или Jsfiddle? Btw, 'myController' здесь' $ controller (myController, {'$ scope': scope}) 'не определен, но он не связан с проблемой. – estus

+0

i can not get the fiddle working bro ... http: //jsfiddle.net/E64Se/106/ – messerbill

+0

В нем используется Jasmine 1.3, а не 2, не уверен, как он ожидает загрузки тестов. Вот шаблон для plunker, http://plnkr.co/edit/ICFsukgLrM45mwROZEqi?p=info – estus

ответ

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

и как я могу это достичь? как я могу дать karma тесты разрешение на доступ к базе данных? или как я могу настроить этот прототип? – messerbill

+0

проверить обновленный ответ –

+0

да, это было то, о чем я и думал, но удаление этой строки приводит к той же ошибке – messerbill