[英]How to mock the open function for unit test
我有兩個文件:
REF_FILE:這是一個數據更改的文件
TEST_FILE:這是具有固定數據的文件(在給定時刻只是REF_FILE)
現在我要測試此功能:
def get_info_from_extract(mpm):
fid = open(REF_FILE)
all_infos = json.load(fid)
fid.close()
for m in all_infos:
if m['mpm_id'] == mpm:
break
return m
class Test_info_magento(unittest.TestCase):
def test_should_have_value(self):
# GIVEN
mpm=107
expected_value = 1.345
# WHEN
#MOCK OPEN FUNCTION TO READ TEST_FILE
m = file_info.get_info_from_extract(mpm)
# THEN
self.assertEqual(m['value'], expected_value)
問題是“ REF_FILE”經常更改,因此我無法對其進行正確測試。 因此,我需要使用“ TEST_FILE”,並且為此,我需要模擬我的開放函數。 我找不到如何模擬它的方法,我想尋求一些幫助找出如何正確模擬它的方法,以使其返回我的“ TEST_FILE”
我建議重寫該函數,以便它接受類似文件的對象(測試和維護起來會更容易)。
但是,如果不能這樣做,請嘗試使用以下上下文管理器:
class MockOpen(object):
def __call__(self, *args, **kwargs):
#print('mocked')
return self.__open(TEST_FILE) #it would be better to return a file-like object instead
def __enter__(self):
global open
self.__open = open
open = self
def __exit__(self, exception_type, exception_value, traceback):
global open
open = self.__open
with MockOpen():
# here you run your test
...
上下文經理代替(內with
語句塊)由全球標簽引用的內置功能open
與自身。 with
塊主體中對open()的每次調用都是對__call__()
方法的調用,該方法將忽略其所有參數並返回打開的TEST_FILE
。
這不是最佳的實現,因為:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.