2017-08-01 17 views
1

まず、このコードを動作させるためにほとんどすべてを試してきましたが、達成しました、問題は私がアプローチが気に入らず、テストコードをより読みやすく、機能的にするためにできることがあれば、もっと良いことがあるかどうかを知ってください。テストされた関数で返されない呼び出された約束をテストする方法

は、私は2番目の関数(secondApiCall)がと呼ばれてきたこと(例えばsinon付き)を主張したいのですが、それを実現するために方法がないように思える、どのようにそれを実現するでしょう。それは非ハッキーなアプローチですか?

ここでの主な問題は、「私はfunctionToTestを変更できません」ということです。基本的にはAPI呼び出しが行われているかどうかを確認するテストを作成する必要があります。

functionToTestが終了した後、どのようにしてアサーションを実行しますか?

PS:コードはたわごとですが、私は知っているが、時にはあなたはちょうどあなたがより多くの感謝はちょうどそれをリファクタリングする前にそれのたわごとをテストすることができない、それに対処する必要がある:(

const firstApiCall =() => { 
    return new Promise(function(resolve,reject) { 
     setTimeout(() => { 
      resolve('firstApiCall success'); 
     }, 3); 
    }); 
}; 

const secondApiCall =() => { 
    return new Promise(function(resolve,reject) { 
     setTimeout(() => { 
      resolve('secondApiCall success'); 
     }, 3); 
    }); 
}; 

const functionToTest =() => { 
    setTimeout(() => { 
     firstApiCall().then(result => { 
       setTimeout(() => { 
        secondApiCall() 
       }, 2) 
      }) 
    }, 15) 
}; 

最後に、あなたが同期コード

const firstApiCall =() => { 
    return { 
     then: (cb) => { 
      cb('firstApiCall success') 
     } 
    } 
}; 

を持っているので、基本的にはモックを生成するコードは、このような何かをありがとうございました!

+2

functionToTestが終了した後に ''どのように与えられたコードを使用すると、アサーションを実行します - ?あなたがすることができません 'functionToTest'はどちらも何も返さない、またそれが終了したとき、それは何かをコールバックしないので...それはあまり書かれていない非同期関数です –

+0

@ JaromandaX私はあなたに完全に同意します、私は非常に良いコードのATMを扱っていますが、どういうわけか、誰かがそれを維持しなければなりません:(そして、問題は "あなたは振る舞いの変化がないことを確認することができます」テストでのみ行うことができます(テストが醜く不可能に近い場合でも) –

+0

コードを変更せずにこれをテストすることはできません。良い答えではありませんが、唯一の正当なものです.APIコールがステートフルな変更に影響する場合、変更が約束のループに反映されているかどうかを調べることができます。ミリ秒。それはどちらかというと素晴らしいことではないが、あなたは立ち往生している。 –

答えて

0

物事のカップルを試した後、何をいつでも行うことができますが、最初のAPI呼び出しモックで、コールバックに同期 1感謝を持っているでしょうあなたを呼び出す代わりに非同期の終わりにして、私は残します返されない約束をテストする際にインスピレーションを必要とする人のための例です。

const firstApiCall =() => { 
    return { 
     then: (callback) => { 
      callback('firstApiCall success'); 
     } 
    } 
}; 

PS:もう一度、この解決策は最も美しいものではありませんが、少なくとも機能します。

0

あなたは第2のAPI CAことを確認することができませんプロミスが返されない限り、直接起こりました。

ここで説明したように:約束が返されない

const functionToTest =() => { 
    setTimeout(() => { 
    firstApiCall().then(result => { 
     setTimeout(() => { 
     secondApiCall() 
     }, 2) 
    }) 
    }, 15) 
}; 

はそうあなたが私見それについてできることは何もありません。機能のモック

は、私が言うと思い、ここで有用ではありません。

直接テストすることができない場合は、間接的にテストすることができます。かなり悪い場合でも、APIを介して、APIの背後にあるリソースの状態が予期したとおりに変化していることを確認できます2回目の呼び出し。 あなたがよくAPIを経由してテストすることができない場合は...その後、テストするために何も過言ではありません。

関連する問題