Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对回调中可访问的相同数据进行多个单元测试_Javascript_Node.js_Callback_Mocha.js_Chai - Fatal编程技术网

Javascript 对回调中可访问的相同数据进行多个单元测试

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);

我实现了一个解析器,从Excel文件中提取数据并返回具有特定结构的对象。为了使代码异步工作,我使用了一个简单的回调方案来进一步处理提取的数据:

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函数的开头检查该全局变量。只需立即执行回调,而不进行调用,然后返回。如果您可以将其封装在某种类型的测试范围内,那么它会更好。这实际上比预期的要简单。非常感谢你!