javascript - Sinon.js、QUnit 和 Jquery。尝试通过 FakeXMLHttpRequest 验证发布的数据

标签 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 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。不过我没有使用该框架的经验。)

最佳答案

对您的测试的一些评论:

  • 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 .

关于javascript - Sinon.js、QUnit 和 Jquery。尝试通过 FakeXMLHttpRequest 验证发布的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422714/

相关文章:

javascript - 基于jQuery中Ajax响应的表单提交

javascript - 如何使用新的 JS 后端从 Perl 6 调用 JavaScript 内置函数?

php - 使用 PHP 进行 JSON 解码

javascript - 无法访问从 $http.post 接收的 JSON 文件中的值

javascript - AJAX post 请求在浏览器中工作,而不是在 Phonegap 应用程序上工作

mysql - 将 JSON 输入插入 MySQL 表

java - 使用 Jackson 进行反序列化

javascript - WebGL:如何将值绑定(bind)到 mat4 属性?

javascript - SharePoint 2013获取列表项字段值

php - 有什么东西不见了吗?在不刷新\重新加载页面的情况下更改\更新页面内容