首頁  >  文章  >  後端開發  >  如何使用unittest.mock模擬上下文管理器中使用的物件?

如何使用unittest.mock模擬上下文管理器中使用的物件?

DDD
DDD原創
2024-10-20 16:27:29570瀏覽

How to Mock Objects Used in Context Managers with unittest.mock?

如何使用unittest.mock模擬上下文管理器中使用的物件

當測試使用with語句模擬的程式碼時,可以是底層對象具有挑戰性。讓我們考慮以下範例:

def testme(filepath):
    with open(filepath) as f:
        return f.read()

要使用 unittest.mock 來測試此函數,我們需要模擬 open 函數。具體方法如下:

Python 3:

  1. 修補builtins.open並使用unittest.mock中的mock_open。
  2. 使用patch作為上下文經理或裝飾師。在這兩種情況下,都將所需的讀取資料傳遞給mock_open,並驗證是否使用預期的參數呼叫了模擬檔。

Python 2:

  1. 修補 __builtin__.open 而不是builtins.open。
  2. 使用mock作為上下文管理器並像以前一樣傳遞mock_open。

範例:

<code class="python">from unittest.mock import patch, mock_open

@patch("builtins.open", new_callable=mock_open, read_data="data")
def test_patch(mock_file):
    assert open("path/to/open").read() == "data"
    mock_file.assert_called_with("path/to/open")</code>

請記住,在Python 3 中,patch 會將模擬物件作為參數傳遞給您的測試函數,而在Python 2 中,您必須明確地對模擬檔案進行斷言。

以上是如何使用unittest.mock模擬上下文管理器中使用的物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn