2016-12-18 5 views
0

デコレータ@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... 
+0

の線に沿って何かが、それはあなたがそうする時間によってデコレータにパッチを適用するには遅すぎるのです。しかし、Python 3.2以降を使用していて、デコレータが 'functools.wraps'を使用している場合は、ラップされたバージョンにアクセスすることができます:http://stackoverflow.com/a/25909794/3001761 – jonrsharpe

+0

関連項目[[ Pythonデコレータが関数をラップする前に?](http://stackoverflow.com/questions/7667567/can-i-patch-a-python-decorator-before-it-wraps-a-function) –

答えて

1

デコレータは包まれた機能へのアクセスを提供するためにラッピング機能の属性を設定することができます。

+0

デコレータを変更せずにこれが可能だったのはいいでしょうが、これはまだまっすぐ進むアプローチのようです – Shatnerz

0

ただ定義が分離しておきます。

モジュールがロードされたときに関数がラップされ

def wrap_foo(func): 
def decorated(*args, **kwargs): 
    func(*args, **kwargs) 
decorated.__wrapped_fn = func 
return decorated 

@wrap_foo 
def foo(): 
pass 

# Wrapped 
foo() 

# Unwrapped 
foo.__wrapped_fn() 
+1

これは多すぎるすでに大きなコードベースになっている可能性のあるものへの変更 – Shatnerz

関連する問題