对同一数据的多个单元测试可在回调中访问

Multiple unit tests on the same data accessible in a callback

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

parse(inputFile, callback) {
    const workbook = new Excel.Workbook();
    workbook.xlsx.readFile(inputFile).then((workbook) => {
        // Parsing
        callback(result);
    });
}

现在我想使用 MochaChai 为这个例程编写一个 单元测试 。当然我可以简单的把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() 块中为 returned 数据对象编写更多测试。通过这种方式,解析将对每个子测试重复

我尝试将 parse() 的调用放在 before() 块中,并定义一个将结果对象存储在全局变量中的回调方法,但显然解析尚未完成测试是 运行.

如果可能的话,最好的方法是什么?如果 parse() 方法 returned a Promise 而不是使用回调会有帮助吗?

您应该能够通过在传递 donebefore 块中进行解析来实现此目的。然后正常测试 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:

 before(() => {
    return excelParser.parse('sheet.xlsx')
      .then((result) => {
        data = result;
      });
  })