Javascript 对回调中可访问的相同数据进行多个单元测试
我实现了一个解析器,从Excel文件中提取数据并返回具有特定结构的对象。为了使代码异步工作,我使用了一个简单的回调方案来进一步处理提取的数据:Javascript 对回调中可访问的相同数据进行多个单元测试,javascript,node.js,callback,mocha.js,chai,Javascript,Node.js,Callback,Mocha.js,Chai,我实现了一个解析器,从Excel文件中提取数据并返回具有特定结构的对象。为了使代码异步工作,我使用了一个简单的回调方案来进一步处理提取的数据: parse(inputFile, callback) { const workbook = new Excel.Workbook(); workbook.xlsx.readFile(inputFile).then((workbook) => { // Parsing callback(result);
parse(inputFile, callback) {
const workbook = new Excel.Workbook();
workbook.xlsx.readFile(inputFile).then((workbook) => {
// Parsing
callback(result);
});
}
现在我想使用Mocha
和Chai
为这个例程编写一个单元测试。当然,我可以简单地将expect()
语句放在回调函数中:
const ExcelParser = require('ExcelParser');
var chai = require("chai");
const expect = chai.expect;
describe('Unit::Test parsing', () => {
const excelParser = new ExcelParser();
it('should parse the data correctly', (done) => {
excelParser.parse('sheet.xlsx', (data) => {
expect(data).to.have.property('mainContent');
expect(data['mainContent']).to.be.an('array');
});
done();
});
});
这很好,但我想在单独的it()
块中为返回的数据对象编写更多测试。通过这样做,解析将针对每个子测试重复进行
我尝试将parse()
的调用放在before()
块中,并定义一个回调方法,将结果对象存储在全局变量中,但显然在运行测试时解析还没有完成
如果可能的话,最好的方法是什么?如果
parse()
方法返回一个Promise
而不是使用回调函数,这会有帮助吗?您应该能够通过在块传递完成之前的中进行解析来实现这一点。然后在it
语句中正常测试
const ExcelParser = require('ExcelParser');
var chai = require("chai");
const expect = chai.expect;
describe('Unit::Test parsing', () => {
const excelParser = new ExcelParser();
let data = null;
before((done) => {
excelParser.parse('sheet.xlsx', (result) => {
data = result;
done();
});
})
it('should parse the data correctly', () => {
expect(data).to.have.property('mainContent');
expect(data['mainContent']).to.be.an('array');
});
it('should have prop foo', () => {
expect(data).to.have.property('foo');
});
...
});
假设excelParser.parse
返回了一个承诺,您就不需要在之前将done
传递给:
before(() => {
return excelParser.parse('sheet.xlsx')
.then((result) => {
data = result;
});
})
在.then()
中,为回调中使用的结果设置一个全局变量,然后在parse函数的开头检查该全局变量。只需立即执行回调,而不进行调用,然后返回。如果您可以将其封装在某种类型的测试范围内,那么它会更好。这实际上比预期的要简单。非常感谢你!