2017-08-22 11 views
-3

私のコードを実行しないで期待しますか?ありがとう理由のsetTimeoutにおける記述のうち、

更新 次のコードを試してみましたが、Error: timeout of 2000ms exceededを取得しました。これは、doneが呼び出されていないためです。 this.myOBJ.toBeTestedFunction({});の実行が完了してから、期待通りに実行する必要があります。コードを修正するには?

it('should', sinon.test(function(done) { 
    const stubFindOne = this.stub(this.myOBJ, 'findOne'); 
    stubFindOne.returns(bluebird.reject(new Error('Should have failed'))); 
    this.myOBJ.toBeTestedFunction({}); 
    setTimeout(function _expect() { 
     console.log('++++++++++++ 1 ++++++++++++++++++++++++++++++++++++++++'); 
     console.log('this.spyLog', this.spyLog.args); 
     expect(this.spyLog.args[0][0].toString()).to.be.equal('Error: Should have failed'); 
     console.log('++++++++++++ 2 ++++++++++++++++++++++++++++++++++++++++'); 
      done(); 
    }, 100); 
    })); 

UPDATE

私の次のコードは動作します。それを改善する方法は?書かれたよう

it('should', sinon.test(function() { 
    const stubFindOne = this.stub(this.myOBJ, 'findOne'); 
    stubFindOne.returns(bluebird.reject(new Error('Should have failed'))); 
    return new bluebird.Promise((resolve, reject) => { 
     this.myOBJ.tobetestedFunction(); 
     resolve(); 
    }) 
    .delay(1000) 
    .then(() => { 
     expect(this.spyLog.args[2][0].toString()).to.be.equal('Error: Should have failed'); 
    }); 
    })); 

答えて

1

(例えばsetTimeoutへのコールバックなど)の任意の非同期コードを実行する前に、テストケースは終了します。 doneパラメータをitコールに追加し、setTimeoutコールバックの末尾にあるdone()を呼び出します。

私は、私が戻って、私が言っていることのコードサンプルをまとめると思っていました。私はあなたのコードをもっと見ていました...これは、 。期待通りのものを期待しているようですが、単に「ええと、100ティック以内に行なわなければならない」というイベントの実行をコントロールするのではなく、良い計画ではありません。はそれがUPDATE

it('should', sinon.test(function(done) { 
    const stubFindOne = this.stub(this.myOBJ, 'findOne'); 
    stubFindOne.returns(bluebird.reject(new Error('Should have failed'))); 
    this.myOBJ.toBeTestedFunction({}); 
    setTimeout(function _expect() { 
     console.log('++++++++++++ 1 ++++++++++++++++++++++++++++++++++++++++'); 
     console.log('this.spyLog', this.spyLog.args); 
     expect(this.spyLog.args[0][0].toString()).to.be.equal('Error: Should have failed'); 
     console.log('++++++++++++ 2 ++++++++++++++++++++++++++++++++++++++++'); 
     done(); 
    }, 100); 
    })); 

のようなものになります、と述べ

- あなたはdoneを追加すると(タイムアウトエラー)が機能しなかったことを言及します。これはほぼ確実です。関数の周りに入れたsinon.testラッパーがあなたのやり方をしているからです。私はsinonに慣れていません(と速いgoogleはtestメソッドのためのドキュメントを立てていませんでした)が、一般的にはsinone.testによって返された関数は(1)doneパラメータを取ると(2)それがラップするコールバックへの最初の引数として渡します。ファンクションにdoneパラメータを設定しても明らかにそのようにはなりません。 sinonのドキュメントを参照する必要があります。 (あなたが使用しようとしているジャスミン機能は「非同期テスト」ですが、sinonはフレームワークに依存しないため、これに対処するかどうかはわかりません。追加のパラメータを取るテストメソッドについては何か?)

なぜこれが良いテスト方法ではないのかについてのフォローアップの質問について:リアルタイムコンピューティング環境でコード化されていないイベントにリアルタイム制約を置くことは決して良い考えではありません。条件を満たすために250ティックを要した場合、それは本当にテスト失敗ですか?もしあなたがパフォーマンスではなく機能性をテストしているのであれば、ここでもあなたはいくつかのハードウェアに合格し、他のハードウェアで失敗するか、あるいは「ある時」テストすることができます。自動テストスイートから欲しい。

あなたが待っているこれらの非同期イベントは、テストが依存する動作のコードの外にあります。その場合、適切な単体テストではありません。あなたは、外部依存関係を模擬し、期待

+0

の評価に向かって、あなたのテストを進めるために嘲笑応答を使用するのと同じように「正しい方法」は、著しくより困難であるこの種の試験を行う

は試してみましたが、 'エラーを得た:タイムアウト「これは良い計画ではない」ということについてもっと詳しく教えてもらえますか?2000年には – BAE

+0

を超えましたか? – BAE

+0

はい。同意する。しかし、これは私が現在変更してはいけない既存のコードのテストを書く仕事です。非同期関数の適切な単体テストを書くには? – BAE

関連する問題