xhr que new example ejemplo javascript node.js xmlhttprequest mocha sinon

new - xmlhttprequest javascript post



uso correcto de la XMLHttpRequest falsa de sinon (2)

Estoy creando XMLHttpRequest javascript module para obtener datos JSON del servidor. Aquí está el código:

(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; } })();

Ahora estoy escribiendo el caso de prueba para esto en nodejs con Mocha y Sinon. Usando FakeXMLHttpRequest de Sinon para probar el módulo y el código de prueba está aquí:

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"}); }); });

Al ejecutar la prueba me sale un error:

ReferenceError: XMLHttpRequest is not defined

Y parece correcto ya que no hay clase / función XMLHttpRequest en nodejs. Pero se supone que la fakeXMLHttpRequest de Sinon hace eso. Pensé en el setUp de Sinon (Mocha''s beforeEach) estamos reemplazando el XMLHttpRequest nativo con fakeXMLHttpRequest. Por favor sugiera lo que estoy haciendo mal? ¿O cuál sería la forma correcta de probar mi módulo en nodejs?


Como está ejecutando esto fuera de un entorno de navegador, no hay ningún objeto XMLHttpRequest . Como te estás burlando de Sinon, lo que puedes hacer es declarar una función global falsa en tu llamada beforeEach llamada.

global.XMLHttpRequest = sinon.useFakeXMLHttpRequest();


Hice esto para anular XMLHttpRequest (vea mi pregunta y respuesta aquí ):

var FakeXMLHTTPRequests = require(''fakexmlhttprequest'') var requests = [] XMLHttpRequest = function() { var r = new FakeXMLHTTPRequests(arguments) requests.push(r) return r }