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

Javascript 使用Jasmine和Karma使用fail方法对jQuery getJSON函数错误进行单元测试,javascript,unit-testing,jasmine,karma-jasmine,Javascript,Unit Testing,Jasmine,Karma Jasmine,我已经为一个调用jQuerygetJSON方法的函数编写了一个单元测试。我正在测试的唯一一件事是,它是用预期的URL调用的。我的单元测试使用Jasmine Spy来模拟API调用。但是,当我运行单元测试时,会出现以下错误: 1) should make a request to the expected URL when running on localhost test module getDataFromApi function TypeError: Cannot rea

我已经为一个调用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();
    });
},

在函数
getDataFromApi
中,在
done
之后链接调用
fail
,但在模拟版本的
done
中,它不返回任何内容(
undefined
),因此,您会得到TypeError:cannotread属性'fail'的undefined

您可以使用
done
函数返回具有
fail
属性的对象,该属性是函数

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

或者,如果您计划在测试中做更多的工作,比如测试成功或失败的响应,那么返回a可能会对您有所帮助

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

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

    return deferred;
  });
});
调用
deferred.reject({'success':false})将为您提供测试错误的机会


希望它对您的函数
getDataFromApi
有所帮助您在
done
之后链接
fail
的调用,但是在模拟版本的
done
中,它不返回任何内容(
undefined
),因此,您会得到TypeError:无法读取undefined的属性'fail'

您可以使用
done
函数返回具有
fail
属性的对象,该属性是函数

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

或者,如果您计划在测试中做更多的工作,比如测试成功或失败的响应,那么返回a可能会对您有所帮助

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

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

    return deferred;
  });
});
调用
deferred.reject({'success':false})将为您提供测试错误的机会

希望能有帮助