簡體   English   中英

覆蓋Python mock的補丁裝飾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM