使用Jasmine和Karma使用fail方法对jQuery getJSON函数错误进行单元测试

时间:2018-11-20 11:30:48

标签: javascript unit-testing jasmine karma-jasmine

我已经为调用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,它返回donefail方法。我在这里做什么错了?

这是我的单元测试:

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 :(得分:1)

在函数getDataFromApi中,您将fail之后的done的调用链接起来,但是在done mocked 版本中,它返回什么都没有(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});将使您有机会测试错误。

希望有帮助