在承诺中对大量数据进行反应测试

时间:2016-06-16 12:32:10

标签: reactjs mocha chai

我很擅长做出反应,甚至更新的测试。

我有一个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;
    });
  }
}

当我运行摩卡时,我不能指望将此视为失败测试。 它总是显示成功。无论我是否故意失败。 这是有效的测试代码吗?

1 个答案:

答案 0 :(得分:1)

当你完成使用它们时,总是返回承诺链,这将允许任何调用代码(在这种情况下,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()返回的承诺也会立即被拒绝。在这种情况下,当其中一个期望失败时,就会发生这种情况,我认为这是可以接受的。

编辑:作为替代方案,您可以使用chai-as-promised,这会为Chai增加承诺支持:

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' ];
  })
);