正确使用sinon的假XMLHttpRequest

编程入门 行业动态 更新时间:2024-10-27 22:33:23
本文介绍了正确使用sinon的假XMLHttpRequest的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在创建XMLHttpRequest javascript模块以从服务器获取JSON数据。以下是代码:

I am creating XMLHttpRequest javascript module to get JSON data from server. Here is the code:

(function() { var makeRequest = function(url,callback,opt) { var xhr; if (XMLHttpRequest) { // Mozilla, Safari, ... xhr = new XMLHttpRequest(); } else if (ActiveXObject) { // IE try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!xhr) { callback.call(this, 'Giving up :( Cannot create an XMLHTTP instance', null); return false; } xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { var data = xhr.responseText; if(opt && !opt.raw) { try { data = JSON.parse(data); } catch (e) { callback.call(this, e,null); return; } } callback.call(this,null,data); } else { callback.call(this, 'There was a problem with the request.', null); } } }; var params = ''; if (opt && opt.params && typeof(opt.params) == 'object') { for( var key in opt.params) { params += encodeURIComponent(opt.params[key]); } } var method = opt && opt.method ? opt.method : 'GET'; if (method == 'GET') { url = params.length > 0 ? url+'?'+params : url; xhr.open('GET', url); xhr.send(); } else if (method == 'POST') { var data = opt && opt.data ? opt.data : params; xhr.open('POST', url); xhr.send(JSON.stringify(data)); } return xhr; } if(typeof module !== 'undefined' && module.exports) { module.exports = makeRequest; } if(typeof window!== 'undefined') { window.getJSONData = makeRequest; } })();

现在我正在使用Mocha和Sinon在nodejs上编写测试用例。使用Sinon的fakeXMLHttpRequest测试模块和测试代码在这里:

Now I am writing the test case for this on nodejs with Mocha and Sinon. Using Sinon's fakeXMLHttpRequest to test the module and test code is here:

var expect = require('chai').expect, getJSON = require('../'), sinon = require('sinon'); describe('get-json-data test the request', function() { beforeEach(function() { this.xhr = sinon.useFakeXMLHttpRequest(); var requests = this.requests = []; this.xhr.onCreate = function (xhr) { requests.push(xhr); }; }); afterEach(function() { this.xhr.restore(); }); it('get json data', function() { var callback = sinon.spy(); getJSON('/some/json', callback); expect(this.requests.length).to.equal(1); this.requests[0].respond(200, {"Content-Type": "application/json"}, '{"id": 1, "name": "foo"}'); sinon.assert.calledWith(callback, {"id": 1, "name": "foo"}); }); });

在运行测试时出现错误:

On running the test I get error:

ReferenceError:未定义XMLHttpRequest

这似乎是正确的,因为nodejs中没有XMLHttpRequest类/函数。但是Sinon的假XMLHttpRequest不应该这样做。我想在Sinon的setUp(Mocha的beforeEach)中我们用fakeXMLHttpRequest替换原生的XMLHttpRequest。 请建议我做错了什么?或者在nodejs上测试我的模块的正确方法是什么?

And it seems correct as there is no XMLHttpRequest class/function in nodejs. But is Sinon's fakeXMLHttpRequest not supposed to do that. I thought in Sinon's setUp (Mocha's beforeEach) we are replacing the native XMLHttpRequest with fakeXMLHttpRequest. Please suggest what I am doing wrong? Or what would be the correct way to test my module at nodejs?

推荐答案

因为你在浏览器环境之外运行它没有 XMLHttpRequest 对象。既然您正在使用Sinon进行嘲弄,那么您可以在 beforeEach 调用中声明一个虚假的全局函数。

Because you are running this outside of a browser environment there is no XMLHttpRequest object. Since your are mocking it with Sinon what you can do is declare a fake global function in your beforeEach call.

global.XMLHttpRequest = sinon.useFakeXMLHttpRequest();

更多推荐

正确使用sinon的假XMLHttpRequest

本文发布于:2023-10-16 11:22:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1497415.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:正确   sinon   XMLHttpRequest

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!