簡體   English   中英

function 中的 side_effect 與裝飾器中的 side_effect 之間的區別

[英]Difference between side_effect within function vs side_effect in decorator

在裝飾器中傳遞 side_effect 與在 function 中設置有什么區別? 我什么時候應該使用其中一種?

   @patch(“my_class.Order.get_order”, side_effect=“mock_order”)
def test_order(self, mock_order):

這是我使用它的另一種方式

@patch(“my_class.Order.get_order”)
 def test_order(self, mock_order):
         mock_order.side_effect = self.mock_order

除了設置副作用的時間外,沒有任何區別。
在您的示例中,在測試 function 開始時設置了副作用,這兩個變體在語義上是可互換的,使用哪個是一個品味問題(我會說裝飾器最好地表明它是針對整個測試,但如果裝飾器表達式太長,也會考慮可讀性)。

原則上,應用副作用存在差異,因為裝飾器在加載時創建修補的 object,而在測試中分配副作用僅在運行時分配。 盡管據我所知,這不會影響測試功能。

僅當在第一種方法中使用全局已知變量或 function 作為副作用時才如此,因為 class 本身尚未定義,並且在加載時不存在 class 實例。 如果您想使用 class 本身的屬性或方法,則根本只有第二個變體有效。 任何依賴於測試 class 本身的副作用都不起作用。

如果您只想在測試后期設置副作用,或者想在測試期間更改它,顯然只能使用第二個變體。

總結一下:

  • 您始終可以使用第二個變體(在運行時設置副作用)
  • 第二個變體使您能夠稍后更改副作用(盡管這很少有用)
  • 如果副作用不依賴於測試 class 本身,或者僅在運行時創建的任何 object ,則可以使用裝飾器版本
  • 如果您能夠使用裝飾器版本,它在語義上等同於第二個變體

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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