2016-05-24 14 views
1

JavaScriptテストフレームワークが初めてです。私は少し最適化したいと思いますが、私はいくつかの問題にぶつかります。このプロジェクトは、ここshould.js非同期関数を使用したモカ/ Should.js

を使用している私の元のテストケースの簡易版である:

describe('Simple', function() { 
    describe('Test', function() { 
    it('should do something', function(done) { 
     somePromise.then(function(data) { 
     data.should.above(100); 
     done(); 
     }); 
    } 

    it('should do something else but alike', function(done) { 
     somePromise.then(function(data) { 
     data.should.above(100); 
     done(); 
     }); 
    } 

    } 
}); 

私はこのようにそれをやろうとしている:約束が非同期である

var testFunc = function(data) { 
    it('should do something', function(done) { 
     data.should.above(100); 
     done(); 
    }); 
} 

describe('Simple', function() { 
    describe('Test', function() { 
     somePromise.then(function(data) { 
     testFunc(data); 
     }); 

     somePromise.then(function(data) { 
     testFunc(data); 
     }); 
    } 
}); 

、および多分それが私の「最適化」がうまくいかなかった理由です。 docs内のdescribe関数の "done"コールバックが見つかりませんでした。

ありがとうございます!どんな助けでも感謝します!

答えて

2

あなたの例は動作しませんsince Mocha has finished registering test cases when your promise resolves。あなたは、単にテストの開始時に約束を作成し、次のようにそれブロックでそれを使用する必要があるいくつかのアサーションを使用して単一の約束をテストするには別のアサーション

と同じ約束をテスト

describe('A module', function() { 
    var promise; 

    before(function() { 
     promise = createPromise(); 
    }); 

    it('should do something', function() { 
     return promise.then(function (value) { 
      value.should.be.above(100); 
     }); 
    }); 

    it('should do something else', function() { 
     return promise.then(function (value) { 
      value.should.be.below(200); 
     }); 
    }); 
}); 

API呼び出しから約束が返された場合、呼び出しは1回だけ行われることに注意してください。 The result is simply cached in the promise for the two test cases.

これはdoneコールバックを使用する代わりにyou can return promises from test casesという事実も利用しています。約束が拒否された場合、またはthen()呼び出しのアサーションのいずれかが失敗した場合、テストケースは失敗します。あなたがテストするための約束を作成testFuncに関数を渡すことができ、同じアサーションを使用して別の約束をテストしたいと仮定すると、同じアサーション

テスト異なる約束。

var testFunc = function(promiseFactory) { 
    it('should do something', function(done) { 
     promiseFactory().then(function(data) { 
      data.should.above(100); 
      done(); 
     }); 
    }); 
} 

describe('Simple', function() { 
    describe('Test', function() { 
     testFunc(function() { return createSomePromise(); }); 

     testFunc(function() { return createSomeOtherPromise(); }); 
    }); 
}); 

モカのit機能が説明するブロック内ですぐに実行されるので、これは動作します。テストケースが実際に実行されるときに、promiseFactoryコールバックを使用して約束が作成されます。

あなたもreturn promises from test casesあなたはこのような約束としてアサーションを返すようにtestFuncを変更することができたよう

var testFunc = function(promiseFactory) { 
    it('should do something', function() { 
     return promiseFactory().should.eventually.be.above(100); 
    }); 
} 

+0

おかげで、それが動作します。しかし、異なるアサーションを使用して1つの約束をテストできますか? – iplus26

+0

私の約束関数の中に 'it'関数をラップしようとしていたので、私の約束関数で非同期APIを一度しか要求できませんでしたが、別のテストをします – iplus26

+0

もちろんあります。約束はこれを非常に簡単にします。あなたがしているのは、テストケース外の約束を作成し、それを変数に割り当てることです。いつものようにそれの中で約束を使用することができます。私は答えを例で更新しました。 –

関連する問題