Angular / Jasmine / Karma - не удается запустить приложение из-за вызова $http в основном модуле

Я вручную загружаю свое приложение Angular после ответа на вызов API (и соответствующей установки константы), таким образом:

(function() {

    var myApp = angular.module('myApp');

    // Bootstrap the app once we've got a config
    var initInjector = angular.injector(['ng']);
    var $http = initInjector.get('$http');

    $http.get('/api/configs').then(
        function(response) {
            myApp.constant('myConfig', response.data);
            bootstrapApp();
        },
        function(error) {
            console.log('Unable to get config', error);
        }
    );

    function bootstrapApp() {
        angular.element(document).ready(function() {
            angular.bootstrap(document, ['myApp']);
        });
    }

})();

Это мешает моим тестам запускаться как $http вызов не высмеивается.

04 07 2017 14:05:53.965:WARN [karma]: No captured browser, open http://localhost:9876/
04 07 2017 14:05:53.987:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
04 07 2017 14:05:55.169:INFO [Chrome 59.0.3071 (Linux 0.0.0)]: Connected on socket /#y-gZChEZ25VdBB7YAAAA with id manual-6637
04 07 2017 14:05:56.270:WARN [web-server]: 404: /api/configs

Как видите, /api/configs звонок неудивительно 404'ing.

Я не могу понять, как это высмеивать. Создание теста для этого модуля и высмеивание $http вызов не исправляет это, поскольку вызов выполняется, когда Карма запускает приложение.

Такое ощущение, что мне нужен "глобальный" $http макет, который доступен для бегуна при запуске. Но я мог лаять совсем не на том дереве.

У кого-нибудь есть мысли? Спасибо!:)

1 ответ

Что вы можете сделать, это иметь установочный файл, который добавляется в files:[ 'mysetup.js', ... ] в karma.conf.js, Там вы можете посмеяться над $http примерно так:

//----mysetup.js----
var response = null;
var replaceHttpGet = function( get ){
    get.success( response ); // or whatever you need
};
//another variable for failure

и тогда вы можете сделать в своем тесте:

//---in test---
var oldHttpGet = $http.get;
$http.get = replaceHttpGet;
response = { //mock response };
...test...
$http.get=oldHttpGet;
Другие вопросы по тегам