私はモックで関数をユニットテストし、モックオブジェクトの呼び出しが行われたかどうかをテストしようとしています。下のコードではrequests.post
オブジェクトが嘲笑され、requests.post.mock_calls
のリストを追跡します。次のコードでpython mock.mock_callsは@timeout修飾された関数の中で行われた呼び出しに従いません
コードの構文:
import timeout_decorator
def block_funds(trader_id, amounts):
@timeout_decorator.timeout(3, use_signals=False)
def _block_funds(block_url, amounts):
# requests.post.mock_calls empty here
result = requests.post(url=block_url, data=amounts)
# requests.post.mock_calls here has correct call recorded
return result.status_code
block_url = 'http:/someurl/somepath/{trader_id}'.format(trader_id=trader_id)
try:
# requests.post.mock_calls empty here
code = _block_funds(block_url, amounts)
# requests.post.mock_calls empty again here
except timeout_decorator.TimeoutError as ex:
logger.error('request failed')
code = 500
return code
私はモックオブジェクトは、それへのすべてのコールの記録を保持することを期待
code = _block_funds(block_url, amounts)
への呼び出しの後
が、mock_calls
リストは、すぐに空にします実行が内部タイムアウトラップ関数_block_funds()
を終了すると、モックオブジェクトは確かに同じですが、オブジェクトが変更されていないことを確認するために模擬IDに従っています。
私が間違ってやっていること、そしてモックを作る方法を呼び出すのを忘れることはありませんか?
あなたのテストで比較して、関数内で値をテストしている1のために使用しているモックオブジェクトは、おそらく同じオブジェクトではありませんが。質問にテスト機能を含めてください。 – jordanm
実際に私は原因を見つけました。これは '@ timeout'デコレータです。いいえ、オブジェクトは同じですが、私は模擬オブジェクトIDに従っていますが、タイムアウト・デコレータをコメントアウトするとすぐに、コールが表示され、テストに合格することがわかりました。私は今テストのための回避策を見つけなければなりません。 – alexykot