デコレータ@auth
は基本的にデータベースをチェックして、ユーザが特定のREST呼び出しにアクセスできることを保証します。私はこれらの呼び出しのためにいくつかの単体テストを書くつもりです。私の最初のアイデアは、単に何もしないパススルーにデコレータをmonkeypatchすることでした。 (私の最初のアイデアは失敗したので、@auth
の中にある機能をモンキーにして、常に通り過ぎるようにしても構いませんが、私はまだ完全にデコレータをバイパスすることができます)ユニットテスト用のデコレータをバイパスする
私は、達成することを望んでいる。
example.py
# example.py
from __future__ import print_function
def sample_decorator(func):
def decorated(*args, **kwargs):
print("Start Calculation")
ans = func(*args, **kwargs) + 3
print(ans)
print("Finished")
return ans
return decorated
@sample_decorator
def add(a, b):
return a + b
test_example.py
# test_example.py
from __future__ import print_function
import pytest
import example
def test_add_with_decorator():
assert example.add(1, 1) == 5
def testadd_with_monkeypatch_out_decorator(monkeypatch):
monkeypatch.setattr(example, 'sample_decorator', lambda func: func)
assert example.add(1, 1) == 2 # this fails, but is the behaviour I want
は、これを実現するためにいくつかの単純な方法はありますか?
def raw_add...
add = sample_decorator(raw_add)
assert example.raw_add...
の線に沿って何かが、それはあなたがそうする時間によってデコレータにパッチを適用するには遅すぎるのです。しかし、Python 3.2以降を使用していて、デコレータが 'functools.wraps'を使用している場合は、ラップされたバージョンにアクセスすることができます:http://stackoverflow.com/a/25909794/3001761 – jonrsharpe
関連項目[[ Pythonデコレータが関数をラップする前に?](http://stackoverflow.com/questions/7667567/can-i-patch-a-python-decorator-before-it-wraps-a-function) –