如何测试$ .ajax从一个sinon假服务器发送的内容类型

时间:2014-08-13 08:12:04

标签: javascript jquery ajax unit-testing sinon

我在方法loadComponent

中有以下ajax调用
function loadComponent( url, success ) {
    $.ajax({
      accepts: "text/html"
      url: url,
      success: success
    });
}

我如何验证" text / html"被正确传递给一个sinon假服务器?

(请注意,我没有使用"正确接受"所以内容类型不会随着ajax调用一起发送)

下面的伪代码:

test( "testing if text/html was sent", function() {
    var server = sinon.fakeServer.create();
    loadComponent( "/url" );
    // How do I make this check ????
    ok( server.wasCalledWithContentType( "text/html" ) );
})

5 个答案:

答案 0 :(得分:1)

使用jQuery

设置请求标头

jQuery文档对accepts参数的使用不直观。通过设置dataType参数来控制Accept标头。如果您希望text/htmldataType设置为html

$.ajax({
    dataType: "html",
    url: "/foo"
});

Accept: text/html, */*; q=0.01

使用accepts参数,您可以自定义给定数据类型的标题内容:

$.ajax({
    dataType: "html",
    accepts: { html: "text/foobar" },
    url: "/foo"
});

Accept: text/foobar, */*; q=0.01

使用Sinon和Jasmine

测试请求标头

现在我们已经了解了$ .ajax的工作原理。带有server.requests[0].requestHeaders的Sinon fakeserver请求标头。 下面是用Jasmine和Sinon编写的示例测试套件。对于实时测试,请检查JSFiddle

describe("Fake server", function() {
    "use strict";

    var server;

    beforeEach(function() {
        server = sinon.fakeServer.create();
        server.autoRespond = true;

        server.respondWith("GET", "/foo",
                          [200, {"Content-Type": "application/json"},
                           '{"message":"foo"}']);
    });

    afterEach(function() {
        server.restore();
    });

    it("accept header should include text/html", function () {
        $.ajax({
            dataType: "html",
            url: "/foo"
        });

        var accept = server.requests[0].requestHeaders.Accept;
        expect(accept).toMatch(/text\/html/);
    });

    it("accept header should include text/foobar", function () {
        $.ajax({
            dataType: "html",
            accepts: { html: "text/foobar" },
            url: "/foo"
        });

        var accept = server.requests[0].requestHeaders.Accept;
        expect(accept).toMatch(/text\/foobar/);
    });

});

答案 1 :(得分:0)

试试这个:

$.ajax({
  url: url,
  success: function(response, status, xhr){ 
    var ct = xhr.getResponseHeader("content-type") || "";
    if (ct.indexOf('html') > -1) {
      //do something
    }
  }
});

答案 2 :(得分:0)

这可行:

$.ajax({
    url: url,
    success: success,
    dataType: "html"
});

答案 3 :(得分:0)

你想在sinon上的服务器假端验证查询吗?可能是你帮助这样的例子:

server.respondWith(method, model,

    (function() {

      var answer = [];

      if (model.attributes.car_model == "") {
        answer = [
          404,
          { "Content-Type": "application/json" },
          '[{"0":"not car selected"}]'
        ];
      } else {
        answer = [
          200,
          { "Content-Type": "application/json" },
          '[{"0":"good query"}]'
        ];
      }

      return answer;

    })(model));

在此示例中,模型和模型属性正在验证,但可以根据需要使用这些属性。

答案 4 :(得分:0)

由于缺乏正确的答案,似乎最新的,sinon fakeServer中没有功能允许测试请求中发送的mime类型。