茉莉间谍以假ajax调用来测试回调结果

Jasmine spy to fake ajax call to test callback results

本文关键字:测试 回调 结果 调用 ajax 间谍      更新时间:2023-09-26

我正在使用Jasmine 2.0,并尝试在ajax调用之后测试回调的结果。我已经尝试了一些我在网上找到的东西,但没有找到解决我问题的方法。我是Jasmine和JQuery的新手,并且在这个问题上遇到了相当困难的时间。如有任何建议,不胜感激。

下面是正在测试的示例代码:

//common.js
function getSomeServiceResponse(method, param, callback) {
$.ajax({
    dataType: "json",
    url: "https://some.thing.com/api/mobile/" + method,
    data: param
})
    .done(function (data) {
        var response = $.parseJSON(data);
        //some stuff
        if ($.isFunction(callback)) {
            callback(response);
        }
    })
    .fail(function (jqXHR, textStatus) {
        //some error handling stuff 
        if ($.isFunction(callback)) {
            callback({
                ResultNumber: -1,
            });
        }
    });
}
//main.js
var someGlobalObj = {
    //some stuff for global obj 
    //some funcs
    querySession: function (callback) {
        //Some validation stuff
        getSomeServiceResponse(
            "querysomesession", {
                //some params
            },
            function (data) {                
                someGlobalObj.sessionData = data.Session;
                someGlobalObj.info = data.Info;
                if ($.isFunction(callback)) {
                    callback(data);
                }
            }
        );
    }
}

测试(请随意评论测试设置/布局,因为我是新手,可能是不正确的):

describe("querySession()", function () {
    describe("with existing session found", function () {
        var response;
        beforeEach(function () {
            spyOn($, 'ajax').and.callFake(function (req) {
                var d = $.Deferred();
                var data = {
                    "Info": [],
                    "Session": {
                        "ID": 999,
                        "DateCreate": "'/Date(1398966244520)'/",
                        //Some other stuff
                    },
                    "ResultNumber": 0,
                };
                d.resolve(data);
                return d.promise();
            });
            someGlobalObj.sessionId = 1;
            someGlobalObj.querySession(function (data) {
                response = data;
            });
        });
        it("should set someGlobalObj.sessionData with an ID of 999", function () {
            //expect(someGlobalObj.sessionData.ID).toBe(999);
            expect(response.Session.ID).toBe(999);
        });

简而言之,someGlobalObj。querySession被调用并传递回调给它。在querySession中,调用getSomeServiceResponse时,会传递给它一个回调(调用原始回调)。在回调触发之后,我希望传入填充响应的数据是在someGlobalObj中设置的数据。这不是我的代码,但我可以回答一些问题,如果有任何。

编辑现在我要进入假的,因为我已经添加了一些控制台日志记录。测试失败,报错:"SyntaxError: Unexpected token o"。如果我只执行d.resolve('fake'),我将得到"Unexpected token k"。

我发现了意想不到的令牌语法错误的问题。

罪犯是:

var data = {
    "Info": [],
    "Session": {
        "ID": 999,
        "DateCreate": "'/Date(1398966244520)'/",
        //Some other stuff
    },
    "ResultNumber": 0,
};
在getSomeServiceResponse.done:

var response = $.parseJSON(data);

我将数据更改为JSON来解决这个问题。最初的问题是,有一些验证,我没有捕获阻止getsomeservicerresponse甚至被调用,所以间谍从未被使用。这在我的问题中是模糊的,因为我已经删除了验证代码。

对不起,浪费了你的时间。