繁体   English   中英

如何模拟开放功能进行单元测试

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

这不是最佳的实现,因为:

  1. 它使用实际的文件,从而降低了测试速度-应该返回类似文件的对象,
  2. 它是不可配置的-应将文件名(或内容)赋予其构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM