与故障方法单元测试的jQuery的getJSON函数错误,用茉莉和噶(Unit testing jQ

2019-10-30 08:46发布

我已经写了一个调用jQuery的功能单元测试getJSON方法。 我是测试的唯一的事情是,它被称为与预期URL。 我的单元测试使用茉莉花间谍嘲笑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

在我的单元测试我创建了一个茉莉花间谍,它返回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();
    });
},

Answer 1:

在你的函数getDataFromApi你链接的呼叫faildone ,但在嘲笑的版本done ,它没有返回值( undefined ),那么,你得到类型错误:无法读取属性“失败”的定义

您可以使done功能与一个返回一个对象fail属性,是一个函数。

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

或者,一个行ES6版本
spyOn($, "getJSON").and.callFake(() => ({ done: () => ({fail: () => {}}) }));

或者,如果您打算做更多的在测试中,测试一样成功或失败的响应,可能返回一个jQuery的递延可以帮助你

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

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

    return deferred;
  });
});

调用deferred.reject({'success': false}); 会给你测试出错的几率。

希望能帮助到你



文章来源: Unit testing jQuery getJSON function errors with the fail method, using Jasmine and Karma