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