节点上的Mocha中的XMLHttprequest

我正在尝试使用node-xmlhttprequest 。 所以如果我这样做

// f.js (function() XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest xhr = new XMLHttpRequest() xhr.open('GET', "http://url-bla-bla.json", true) xhr.onreadystatechange = function(){ console.log("xhr "+JSON.stringify(xhr)) } xhr.send() )() 

并将其称为node f (假设Access-Control-Allow-Origin不是http://url-bla-bla.json链接的问题 – 它起作用

但如果我尝试它包装同样的东西到摩卡规格

 describe('foo',function(){ it('xhr test',function(){ XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest xhr = new XMLHttpRequest() xhr.open('GET', "http://url-bla-bla.json", true) xhr.onreadystatechange = function(){ console.log("xhr "+JSON.stringify(xhr)) } xhr.send() } } 

并与mocha f运行(我甚至不必包装在摩卡规格)

它将无法正常工作并且失败,并且readyState == 1

这是一个asynchronous操作。 在Mocha中,您必须使用donecallback来完成操作完成后的testing,如下所示:

 describe('foo',function(){ it('xhr test',function(done){ XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest xhr = new XMLHttpRequest() xhr.open('GET', "http://url-bla-bla.json", true) xhr.onreadystatechange = function(){ console.log("xhr "+JSON.stringify(xhr)) if (xhr.readyState === 4) done(); } xhr.send() }); }); 

除了修正语法错误之外,唯一的其他变化是将done参数添加到调用的callbackonreadystatechanges并在onreadystatechanges执行时调用done()readyState已达到4