Javascript Sinon.js、QUnit和Jquery。试图通过FakeXMLHttpRequest验证发布的数据

Javascript Sinon.js、QUnit和Jquery。试图通过FakeXMLHttpRequest验证发布的数据,javascript,ajax,json,qunit,sinon,Javascript,Ajax,Json,Qunit,Sinon,我有以下QUnit测试用例,它试图验证通过JQuery ajax请求发送的发布数据: test("ajax tests", function () { var xhr = sinon.useFakeXMLHttpRequest(); var requests = sinon.requests = []; xhr.onCreate = function (request) { requests.push(request); }; var

我有以下QUnit测试用例,它试图验证通过JQuery ajax请求发送的发布数据:

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对象动态验证请求数据。我更喜欢这样,而不是模仿jquerypost或ajax方法。因为如果我在发送AJAX请求的实现之间切换,我不希望我的单元测试失败

有人在这件事上运气好吗

参考资料:

上述代码的演示:

一篇文章展示了我试图实现的目标:


(代码对我来说不起作用。我怀疑需要处理backbone.js。不过我没有使用该框架的经验。)

对您的测试有几点评论:

  • jQuery
    ajax(
    )文档说明,如果
    数据
    参数不是字符串,则将使用
    $.param()
    将其转换为查询字符串。您可以通过传递字符串来避免这种转换
  • 最后一个断言将
    [Object].mockData
    与名为
    mockData
    的变量进行比较。我猜那只是个打字错误
下面是一个经过稍微修改的测试(),它通过了:

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();
});

至于这篇文章,我并没有真正研究代码,但它似乎有效:。

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