2016-04-28 5 views
-2

javascriptでsetTimeoutの内部にある関数をテストするには?私のテストコードで

functionDoThings = function(){ 
    doSomethingA(); 
    setTimeout(function(){ 
     doSoemthingB(); 
    }, 1000); 
} 
、私は期待して(BCalled)が早すぎると呼ばれているので、それがある

testDoThings = function(){ 
    var ACalled, BCalled = false; 
    doSomethingA() = function(){ACalled = true;}; 
    doSoemthingB() = function(){BCalled = true;}; 
    functionDoThings(); 
    expect(ACalled).to.be.ok; //Passed 
    expect(BCalled).to.be.ok; //Fail 
} 

を持っています。 doSoemthingBがsetTimeout()の内部で呼び出されるのをテストするにはどうすればよいですか?

+0

適切な非同期設計は、操作の非同期一部が行われ、どのような値またはエラーが返されたときに指示完了コールバックを持っている(または同じ目的を果たす約束を返す)になりますように見えます。表示するコードをテストできるようにするには、コールバックで結果を返すように修正する必要があります。さもなければ、テストコードは、いつ実行されたか、その結果が何であるか分かりません。 – jfriend00

+0

定義される前に関数を呼び出す。 – Redu

答えて

0

これは、ACalledが起こった直後にBCalledが起きると予想されることを意味します。しかし、あなたはまた、1秒の遅れがあるはずだと言った。

デザインに入らずに、setTimeout()に期待値をラップしてテストすることもできます。

また、関数呼び出しに値を割り当てます。それはあるはずですdoSomethingA = function(){ACalled = true}

ここは試してみるべきコードですが、なぜそれがうまくいかないのかがわかります。

testDoThings = function(){ 
    var ACalled, BCalled = false; 
    doSomethingA = function(){ACalled = true;}; 
    doSoemthingB = function(){BCalled = true;}; 
    functionDoThings(); 
    console.log(ACalled === true); // true 
    console.log(BCalled === true); // false 
    setTimeout(function(){ 
     console.log(BCalled === true); // true 
    }, 1000); 
} 
0

あなたがsetTimeout()を呼び出すと、それは現在のスコープの後に実行されるスタックにあなたの関数を追加します。あなたのコードを更新すると、expect(BCalled).to.be.okdoSoemthingB()の後に置くと、予想される回答が届きます。

functionDoThings = function(){ 
    var BCalled = false; 

    doSomethingA(); 
    setTimeout(function(){ 
    doSoemthingB(); 
    expect(BCalled).to.be.ok 
    }, 1000); 
} 
関連する問題