在承诺中反应测试批量数据

React testing bulk data within promises

我对反应还很陌生,在测试方面更陌生。

我有一个 json 数据数组的验证函数。 输入包含数据以及每个参数的参数,指示验证是否应该失败。

describe('ValidatorFactory', () => {
  it('should check data', () => {

   let data = [{} ... ...];// data filled in from file.
    for (let el of country.TestData) {
      // Validate is defined elsewhere.
      validate({value: el.value}).then(
    () => {
      expect(el.valid).to.be.true;
    },
    () => {
      expect(el.valid).to.be.false;
    });
  }
}

当我 运行 mocha 时,我无法期望将此识别为失败测试。 它总是显示成功。不管我是否故意失败。 这是有效的测试代码吗?

总是 return 承诺链,当你完成它们时,这将允许任何调用代码(在本例中为 Mocha)进一步处理链。

看起来这是对您的代码的合理抽象:

// Example validator that will reject when `obj.value` equals 2:
function validate(obj) {
  if (obj.value === 2) {
    return Promise.reject(new Error("I hate 2's"));
  } else {
    return Promise.resolve();
  }
}

describe('ValidatorFactory', () => {

  it('should check data', () => {

    let data = [
      { value : 1, valid : true },
      { value : 2, valid : false },
      { value : 3, valid : true }
    ];

    return Promise.all(
      data.map((el) => {
        return validate(el).then(() => {
          expect(el.valid).to.be.true;
        }, () => {
          expect(el.valid).to.be.false;
        });
      })
    );
  })
})

[Promise.all( data.map(...) )代码是一个快捷方式:

let array = []
array.push( validate(data[0]).then(..., ...) );
array.push( validate(data[1]).then(..., ...) );
...
return Promise.all(array);

换句话说,它生成一个承诺数组,Promise.all() 将全部解决。

请注意 Promise.all()"fail-fast" behaviour:如果它必须解决的承诺之一被拒绝,则由 Promise.all() 编辑的承诺 return 将被拒绝,因为好吧,马上。在这种情况下,当其中一个期望失败时会发生这种情况,我认为这是可以接受的。

编辑:作为替代方案,您可以使用 chai-as-promised,它为 Chai 添加了 promise 支持:

const chai   = require('chai');
const expect = chai.expect;
chai.use(require('chai-as-promised'));

...

return Promise.all(
  data.map((el) => {
    return expect(validate(el)).to.be[ el.valid ? 'fulfilled' : 'rejected' ];
  })
);