节点上Mocha中的XMLHttprequest

iLe*_*ing 1 javascript xmlhttprequest mocha.js node.js

我正在尝试使用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()
)()
Run Code Online (Sandbox Code Playgroud)

并称之为node f(假设链接Access-Control-Allow-Origin不是问题http://url-bla-bla.json- 它有效

但如果我尝试将相同的东西包装到Mocha spec中

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()
  } 
}
Run Code Online (Sandbox Code Playgroud)

并运行mocha f(我甚至不必将其包装在Mocha规范中)

它不会工作,也不会失败 readyState == 1

Lou*_*uis 5

这是一个异步操作.在Mocha中,您必须使用done回调来在操作完成时完成测试,如下所示:

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()
  });
});
Run Code Online (Sandbox Code Playgroud)

除了修复语法错误之外,唯一的其他更改是将done参数添加到调用的回调中,itdone()onreadystatechanges执行时调用并且readyState已到达4.