這個問題測試裝修裝飾是後續this brilliant answer關於裝飾在Python:蟒蛇通過模擬
我使用給定的「片段做任何裝飾一般接受任何說法」。
然後,我有這樣的(這裏的簡化)裝飾:
@decorator_with_args
def has_permission_from_kwarg(func, *args, **kwargs):
"""Decorator to check simple access/view rights by the kwarg."""
def wrapper(*args_1, **kwargs_1):
if 'kwarg' in kwargs_1:
kwarg = kwargs_1['kwarg']
else:
raise HTTP403Error()
return func(*args_1, **kwargs_1)
return wrapper
- 與這個裝飾,沒有問題它的工作非常好工作。
- 測試一個類似的裝飾,不需要絕對的kwargs,相同的結果。
但測試這個裝飾用下面的模擬不起作用:
def test_can_access_kwarg(self): """Test simple permission decorator.""" func = Mock(return_value='OK') decorated_func = has_permission_from_slug()(func(kwarg=self.kwarg)) # It will raise at the following line, whereas the kwarg is provided... response = decorated_func() self.assertTrue(func.called) self.assertEqual(response, 'OK')
它返回我時,我沒有「kwarg」關鍵字參數我提出的例外...
有誰有一個線索如何(用嘲諷將是可取的),這樣的裝飾由需要訪問的傳遞給函數的關鍵字參數彼此裝飾裝潢測試?
嗨戳,謝謝你的回答! 我應該在之前說過,但是當然我也試過你的建議。不幸的是: 第一個樣本失敗,因爲'response = decorated_func(kwarg = self.kwarg)'返回「TypeError:'str'對象不可調用」 第二個工程,但不適合我原來的範圍,我想測試一個在我的代碼中使用kwargs_1的裝飾器。 – Rmatt
在最後一個代碼示例中有一個小錯誤,現在也可以使用。第一個解決方案雖然工作。 – poke
好,但第二個例子仍然不符合我的目的。第一個仍然失敗。它做的工作超越了kwarg檢查,但失敗了,返回func(* args_1,** kwargs_1)' – Rmatt