所以我知道在我的單元測驗中我可以模擬背景關系管理器 open(),即:
with open('file_path', 'r') as stats:
被嘲笑
with mock.patch('builtins.open', mock.mock_open(read_data=mock_json)):
但是有沒有辦法讓我只為特定的檔案路徑模擬它?或者也許有其他方法可以確保在單元測驗中使用正確的路徑呼叫背景關系管理器?
uj5u.com熱心網友回復:
要僅為特定路徑模擬打開,您必須提供自己的模擬物件,該物件根據路徑以不同方式處理打開。假設我們有一些函式:
def do_open(path):
with open(path, "r") as f:
return f.read()
open如果path是“bar”,則應模擬where以回傳內容為“bar”的檔案,否則照常作業,您可以執行以下操作:
from unittest import mock
from my_module.do_open import do_open
builtin_open = open # save the unpatched version
def mock_open(*args, **kwargs):
if args[0] == "foo":
# mocked open for path "foo"
return mock.mock_open(read_data="bar")(*args, **kwargs)
# unpatched version for every other path
return builtin_open(*args, **kwargs)
@mock.patch("builtins.open", mock_open)
def test_open():
assert do_open("foo") == "bar"
assert do_open(__file__) != "bar"
如果您不想將原始檔案保存open在全域變數中,也可以將其包裝到一個類中:
class MockOpen:
builtin_open = open
def open(self, *args, **kwargs):
if args[0] == "foo":
return mock.mock_open(read_data="bar")(*args, **kwargs)
return self.builtin_open(*args, **kwargs)
@mock.patch("builtins.open", MockOpen().open)
def test_open():
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/336831.html
標籤:Python 单元测试 嘲笑 python-unittest
