Жасмин с Кармой: Аякс не работает

Проблема

Я запускаю тесты Javascript, используя Jasmine и Karma (как участник тестирования). Проблема в том, что Ajax запросы не работают.

Если я проведу следующий тест Жасмина с Кармой:

describe("Tests Ajax", function(done){
    it("does not work", function(){
        var options = {
            "url": "http://www.google.com",
            "method": "GET",
            "complete": function(data){
                console.log("Done!");
                done();
            }
        };

        $.ajax(options);
    });
});

Я получаю следующую ошибку кармы:

        PhantomJS 1.9.8 (Windows 8) Tests Ajax does not work FAILED
            Error: Timeout - Async callback was not invoked within timeout specified
            by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Это означает, что тест длился долго. Я пробовал установить jasmine.DEFAULT_TIMEOUT_INTERVAL на большее время в beforeEach, но это не повлияло на результаты.

Если я затем запустил указанный выше код Ajax в своем браузере, он заработает и выдаст Done! почти сразу же.

Приведенные выше результаты приводят меня к выводу, что по какой-то причине запросы Ajax не работают при запуске тестов Jasmine с Karma.

Дополнительная информация

ОС: Windows 8
Браузеры Karma Test: PhantomJS (я также тестировал с IE, Chrome, ChromeCanary и Firefox, результат тот же)
Версия Karma: 0.12.31
Версия Karma Jasmine: 0.3.2

Файл конфигурации Karma
Github Repo

Я предпочитаю не использовать Jasmine Ajax, потому что код, который я тестирую, включает сборку различных Ajax options правильно основанный на многих других условиях, а затем интерпретируя результаты. Таким образом, необходимо выполнить настоящий запрос Ajax (к локальным файлам).


person Noah Huppert    schedule 09.01.2015    source источник


Ответы (1)


Чтобы обойти эту проблему, я решил запустить свои тесты с помощью grunt-contrib-jasmine и получить сервер, работающий в фоновом режиме, обслуживающий мой контент.

Я использовал https://github.com/aetheon/grunt-http-server в качестве сервера. При настройке я столкнулся с двумя проблемами. Во-первых, по умолчанию grunt-http-server не разрешает запросы с перекрестным происхождением. Чтобы разрешить их, вы должны добавить параметр headers в настройку задачи grunt со следующими заголовками:

{
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
}

Вторая проблема заключалась в том, что grunt-http-server возвращает данные не в поле body, а в полях responseText или responseJSON.

person Noah Huppert    schedule 11.01.2015
comment
responseText для меня звучит как правильное поле. У меня была аналогичная проблема, и это было связано с тем, что CORS не принимает запрос - вызывается ли ваш метод onError? Это должно сказать вам, где возникает ошибка. - person Kyle Chadha; 29.04.2015