Модульное тестирование ошибок функции jQuery getJSON методом fail с использованием Jasmine и Karma - PullRequest
0 голосов
/ 20 ноября 2018

Я написал модульный тест для функции, которая вызывает метод jQuery getJSON.Единственное, что я тестирую, это то, что он вызывается с ожидаемым URL.Мой модульный тест использует Jasmine Spy для насмешки вызова API.Однако, когда я запускаю свои модульные тесты, я получаю эту ошибку:

1) should make a request to the expected URL when running on localhost
     test module getDataFromApi function
     TypeError: Cannot read property 'fail' of undefined

В моем модульном тесте я создал Jasmine Spy, который возвращает методы done и fail.Что я здесь не так делаю?

Вот мой модульный тест:

describe('getFundDataFromApi function', function () {
    beforeEach(function () {
        spyOn($, "getJSON").and.callFake(function () {
            return {
                done: function () {},
                fail: function () {}
            };
        });
    });
    it('should make a request to the expected URL when running on localhost', function () {
        var expectedUrl = '/assets/mock-data/mock-data.json';
        module.getDataFromApi();
        expect($.getJSON).toHaveBeenCalled();
        expect($.getJSON).toHaveBeenCalledWith({url:expectedUrl});
    });
});

Функция, которую я пытаюсь проверить: getDataFromApi

getDataFromApi: function () {
    var mod = this;
    var url = this.settings.apiUrl;

    $.getJSON({
        url: url
    })
    .done(function (data) {
        mod.processApiData(data);
    })
    .fail(function () {
        mod.displayErrorMessage();
    });
},

1 Ответ

0 голосов
/ 21 ноября 2018

В вашей функции getDataFromApi вы связываете вызов fail после done, но в смоделированной версии done он ничего не возвращает (undefined), поэтомувы получаете TypeError: Невозможно прочитать свойство 'fail' из неопределенного .

Вы можете заставить функцию done вернуть объект со свойством fail, которое является функцией.

beforeEach(function() {
  spyOn($, "getJSON").and.callFake(function() {
    return {
      done: function() {
        return { fail: function() {} };
      }
    };
  });
});

Или одна строка ES6 версии
spyOn($, "getJSON").and.callFake(() => ({ done: () => ({fail: () => {}}) }));

Или, если вы планируете делать больше в своих тестах, например, успешное тестирование или неудачные ответы, возможно, возвращая jQuery Deferred может помочь вам

beforeEach(function() {
  spyOn($, "getJSON").and.callFake(function() {
    const deferred = $.Deferred();

    deferred.resolve({'success': true});

    return deferred;
  });
});

Вызов deferred.reject({'success': false}); даст вам возможность проверить ошибки.

Надеюсь, это поможет

...