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
这是一个异步操作.在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参数添加到调用的回调中,it并done()在onreadystatechanges执行时调用并且readyState已到达4.