节点上Mocha中的XMLHttprequest

XMLHttprequest within Mocha on Node

本文关键字:XMLHttprequest 中的 Mocha 节点      更新时间:2023-09-26

我正在尝试使用节点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链路的问题-它工作于

但如果我试着把同样的东西包进Mocha规格的

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运行(我甚至不必用Mocha规范包装它)

使用readyState == 1 时它将不起作用并失败

这是一个异步操作。在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()
  });
});

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