如何使用Jasmine测试XMLHttpRequest

时间:2012-01-17 20:39:59

标签: javascript ajax jasmine

如何在没有jQuery的情况下测试XMLHttpRequest或纯Javascript AJAX上的onreadystatechange?我这样做是因为我正在开发Firefox扩展。我想我必须使用间谍,但无法弄清楚因为我的ajax不会返回任何东西。


    submit : function() {
        var url = window.arguments[0];
        var request = new XMLHttpRequest();
        request.open("POST", 'http://'+this.host+'/doSomething', true);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        request.send("param="+param+"&emotions="+this.getParams());
        request.onreadystatechange = function() {
            if(this.readyState == 4) {
                // alert(this.responseText);
            }
        };

    }

5 个答案:

答案 0 :(得分:36)

那个呢?

beforeEach(function() {
  // spyOn(XMLHttpRequest.prototype, 'open').andCallThrough(); // Jasmine 1.x
  spyOn(XMLHttpRequest.prototype, 'open').and.callThrough(); // Jasmine 2.x
  spyOn(XMLHttpRequest.prototype, 'send');
});

...

it("should call proper YQL! API", function() {
  podcast.load_feed('http://www.faif.us/feeds/cast-ogg/');

  expect(XMLHttpRequest.prototype.open).toHaveBeenCalled();
});

Pure Jasmine,无需使用任何外部库。

答案 1 :(得分:10)

答案 2 :(得分:6)

正如SinonJS的评论中提到的那样,您可以轻松地mock the XHR object / create a fake server

答案 3 :(得分:2)

你可以用这种方式测试它

it("should make XHR request", function() {

   // arrange

    var xhr = {
        open: jasmine.createSpy('open')
    };

    XMLHttpRequest = jasmine.createSpy('XMLHttpRequest');
    XMLHttpRequest.and.callFake(function () {
        return xhr;
    });

    // act

    submit();

    // assert

    expect(xhr.open).toHaveBeenCalled(); 
});

答案 4 :(得分:-1)

根据下面代码的传真,您可能会使用状态代码和状态文本注入console.log()。

这将帮助您识别任何http错误。据推测,我会说状态将返回404。

submit : function() {
    var url = window.arguments[0];
    var request = new XMLHttpRequest();
    request.open("POST", 'http://'+this.host+'/doSomething', true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send("param="+param+"&emotions="+this.getParams());
    request.onreadystatechange = function() {
        console.log(this.status+ " - "+ this.statusText);
    };

}

另一种方法是查看firebug控制台中的请求标头/响应。这是一个好点:如果你没有使用firebug或chrome dev工具,你应该将console.log()调用更改为将字符串附加到文档对象的内容使用警报( )打电话。

How do I verify jQuery AJAX events with Jasmine?。实现Jasmine的类似答案。