Jasmine间谍假冒ajax调用来测试回调结果

时间:2014-05-06 18:55:20

标签: javascript jquery ajax callback jasmine

我使用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中设置的。这不是我的代码,但如果有的话,我也许可以回答一些问题。抱歉有任何困惑。

修改 我现在正在进入假冒,因为我已经添加了一些控制台日志记录。测试失败并出现错误:"语法错误:意外的令牌o"。如果我只是做d.resolve('假的'),我会得到"意想不到的令牌k"代替。不确定此错误的来源。

1 个答案:

答案 0 :(得分:0)

我发现了意外令牌语法错误的问题。

罪魁祸首是:

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

在getSomeServiceResponse.done中:

var response = $.parseJSON(data);

我将数据更改为JSON以解决问题。最初的问题是有一些验证我没有注意到甚至无法调用getSomeServiceResponse,所以间谍从未使用过。这在我的问题中是模糊的,因为我删除了验证码。

很抱歉浪费时间......再次编码迟到了。