2016-06-16 8 views
0

私はかなり反応して、テストではさらに新しいです。約束の範囲内で一括データを反復して処理する

私はデータの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を実行すると、これをFAILINGテストとして認識することは期待できません。 常に成功を示しています。私が意図的に失敗するかどうかは関係ありません。 有効なテストコードですか?

答えて

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があります。解決しなければならない約束の1つが拒​​否された場合、Promise.all()によって返された約束はすぐに拒否されます。この状況では、これは予想の1つが失敗したときに起こります。私はそれが受け入れられると思います。

EDIT:代替手段として、あなたはchai-as-promisedを使用することができ、チャイに約束のサポートが追加されています

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

(それはエラーになります)成就にfullfilled変更してください。そうでなければ恐ろしい答え:-)私はあなたのポストで少なくとも6文字を編集する必要があるので、私はそれを行うことはできません...不要です:D –

+0

@PotneySwitters oops = Dはそれを修正! – robertklep