【问题标题】:how to test ajax response using jasmine如何使用茉莉花测试ajax响应
【发布时间】:2016-04-14 11:21:45
【问题描述】:

我是茉莉花的新手。 我正在寻找一种方法来检查 ajax 响应中是否存在一个特定节点。我正在使用 grunt 运行 jasmine 命令行。我能够检查成功 Ajax 调用后是否调用了函数。我的代码如下所示。

describe("Ajax call test.", function () {
    it("should execute the callback function on success", function () {
        spyOn($, "ajax").and.callFake(function(options) {
            options.success();
        });
        var callback = jasmine.createSpy();
        getSampleResponse( callback);
        expect(callback).toHaveBeenCalled();
    });

    function getSampleResponse(callback){
        $.ajax({url: "template/sample.json", dataType:"text", success:function(res){            
            callback();
            }
        });
    }
});

我的 sample.json 文件如下所示。

{
   success: {

    "numSearches":5,
    "data":[
        {title:'search title 1', count:1},
        {title:'search title 2', count:1},
        {title:'search title 3', count:1},
        {title:'search title 4', count:1},
        {title:'search title 5', count:1}
    ]

  } 
}

我想检查响应是否包含success.numSearches。 我怎么能用茉莉花来做到这一点。 提前致谢。

【问题讨论】:

    标签: javascript ajax jasmine


    【解决方案1】:

    拉杰什,

    您已经使用模拟来消除实际的 ajax 调用。您是否要测试 numSearches 的模拟响应?

    在您的成功调用中,您没有将 json 响应 res 传递给您的回调方法。

    这是一篇在 Jasmine 中测试 ajax 调用的好文章 http://www.htmlgoodies.com/html5/javascript/testing-ajax-event-handlers-using-jasmine-spies.html

    一种测试 ajax 响应的方法是

    describe("Ajax call test.", function () { it("should execute the callback function on success", function () { var callbackCalled = false; function myCallback(jsonData) { callbackCalled = true; expect(jsonData.numSearches).toBeEqual(5); } getSampleResponse(myCallback); expect(callbackCalled).toBeTruthy(); });

    function getSampleResponse(callback){
        $.ajax({url: "template/sample.json", dataType:"text", success:function(res){            
            callback(res);
            }
        });
    }
    

    });`

    请注意,我在您的回调方法中添加了res 作为参数

    【讨论】:

    • 我没有找到任何异步ajax回调数据的解决方案。所以我试图这样至少让成功函数被调用。我可以通过在 $.ajax 中添加 async:false 来测试 ajax 调用,这使得规范等待它完成。只是找不到测试异步 ajax 响应的方法。
    • 我按照你提到的那样尝试过,但出现错误:错误:文件中不存在回调()方法:///C:/inetpub/wwwroot/tes tCase/.grunt/grunt-contrib-jasmine /jasmine.js (line 1992) (1) 然后我尝试添加 window.callback = function(){};然后得到这个错误。 TypeError: undefined is not an object (evalating 'window.callback.mostRecentCall.args') in file:///C:/inetpub/wwwroot/testCase/spec/domSpec.js (line 50) 如果你可以试试看如果它对你有用,那将非常有帮助。还是谢谢。
    • 抱歉,试试新的实现。我错过了你实际上是在回调方法中传递
    • 单元测试中的实际 ajax 调用可能不适合作为一种实践。您可能希望在集成测试中测试实际的服务调用,以保持单元测试快速高效地运行
    • 这不起作用。这样它似乎不会等待ajax响应。期望假为真。 (1) 在保持测试快速运行方面,您可能是正确的。但我可能会保留一个单元测试文件,其中包含所有 ajax 调用规范来检查服务器是否给出正确的响应。还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多