如何在没有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);
}
};
}
答案 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的类似答案。