2014-06-26 32 views
2
验证发布数据

我有以下QUnit测试情况下,尝试验证通过JQuery的AJAX请求中发送的发布数据:Sinon.js,QUnit和Jquery。试图通过FakeXMLHttpRequest

test("ajax tests", function() { 
    var xhr = sinon.useFakeXMLHttpRequest(); 
    var requests = sinon.requests = []; 

    xhr.onCreate = function (request) { 
     requests.push(request); 
    }; 

    var callback = sinon.spy(); 
    var mockData = {mockData: "dummy content"} 

    $.ajax('/some/article', { success: callback, data: mockData, method: 'post' }); 

    equal(sinon.requests.length, 1); 
    equal(sinon.requests[0].url, "/some/article"); 
    equal(JSON.parse(sinon.requests[0].requestBody).mockData, mockData) 

}); 

的JSON.parse失败,因为请求体是格式为:mockdata=dummy+content

由于数据是如何编码的(空格替换为+符号),因此对内容进行解码并随后使其对JSON进行解析非常困难。

最终目标是使用假XHR对象动态验证请求数据。我更喜欢通过嘲笑jQuery post或ajax方法。因为如果我在用于发送AJAX请求的实现之间切换,我不希望我的单元测试失败。

有没有人有这样的运气?

参考文献:

上面的代码演示:http://jsfiddle.net/ZGrTK/66/

这证明了我的努力实现的文章:http://philfreo.com/blog/how-to-unit-test-ajax-requests-with-qunit-and-sinon-js/

(代码不为我工作的东西来处理backbone.js我怀疑我没有这方面的经验)

回答

2

对你的测试有几点意见:

  • jQuery ajax()文档说,如果data参数不是字符串,则将使用$.param()将其转换为查询字符串。您可以通过传递字符串来避免该转换。
  • 最后一个断言将[Object].mockData与名为mockData的变量进行比较。我猜这只是一个错字。

下面是经过稍微修改的测试(JSFiddle):

test("ajax tests", function() { 
    var xhr = sinon.useFakeXMLHttpRequest(), 
     requests = [], 
     mockURI = '/some/article', 
     mockData = { 
      someProperty: "dummy content" 
     }; 

    xhr.onCreate = function (request) { 
     requests.push(request); 
    }; 

    $.ajax(mockURI, { 
     data: JSON.stringify(mockData), 
     type: 'POST' 
    }); 

    equal(requests.length, 1); 
    equal(requests[0].url, mockURI); 
    equal(JSON.parse(requests[0].requestBody).someProperty, mockData.someProperty); 

    xhr.restore(); 
}); 

至于文章中,我并没有真正研究代码,但它似乎工作:JSFiddle

+0

我没有意识到jQuery ajax函数处理字符串数据的方式不同。感谢您解释良好的解决方案。 –