[英]Overriding Python mock's patch decorator
我有一個Python TestCase
類,除了一個測試方法之外,所有測試方法都需要以相同的方式修補對象。 另一種方法需要來自同一對象的一些其他行為。 我正在使用模擬 ,所以我做了:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
@mock.patch('method_to_patch', mock.Mock(return_value=2))
def test_override(self):
(....)
但那不起作用。 運行test_override
,它仍然會從類裝飾器調用修補的行為。
大量的調試后,我發現該期間TestSuite
打造, @patch
周圍test_override
被稱為一繞前Tests
,由於mock
應用補丁才能,類裝飾壓倒一切的方法裝飾。
這個訂單是否正確? 我期待相反的情況,我不確定如何覆蓋修補......也許用with
語句?
好吧,事實證明,良好的睡眠和冷水淋浴使我重新思考整個問題。 我對嘲諷的概念還很陌生,所以它仍然沒有完全正確地沉沒。
問題是,沒有必要將補丁覆蓋到模擬對象。 這是一個模擬對象,這意味着我可以做任何事情。 所以我的第一次嘗試是:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
def test_override(self):
method_to_patch.return_value = 2
(....)
這有效,但有副作用,改變所有后續測試的返回值。 那么我試過:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
def test_override(self):
method_to_patch.return_value = 2
(....)
method_to_patch.return_value = 1
它就像一個魅力。 但似乎代碼太多了。 那么我就走上了上下文管理的道路,就像這樣:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
def test_override(self):
with mock.patch('method_to_patch', mock.Mock(return_value=2):
(....)
我覺得它看起來更清晰,更簡潔。
關於patch
裝飾器的應用順序,它實際上是正確的順序。 就像從下到上應用堆疊裝飾器一樣,應該在類裝飾器之前調用方法裝飾器。 我想這很有道理,我只是期待相反的行為。
無論如何,我希望這將有助於一些像我一樣可憐的新手靈魂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.