如何模拟单元tes的开放函数

2024-04-19 06:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两份文件:

REF_FILE:它是一个包含更改数据的文件

TEST_文件:它是一个包含固定数据的文件(它只是一个给定时刻的REF_文件)

现在我要测试这个函数:

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”,为此我需要模拟我的open函数。我无法找到如何模仿它,我想一些帮助,以找出如何正确地模仿它,以使它返回我的'测试'文件'


Tags: 文件数据函数fromtestinforefget
1条回答
网友
1楼 · 发布于 2024-04-19 06:24:57

我建议重写函数,使其接受类似文件的对象(测试和维护会更容易)。在

但是,如果不能,请尝试此上下文管理器:

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
    ...

上下文管理器用自身替换全局标签open引用的内置函数(在with语句块内)。{{cd4}调用的所有

这不是最好的实现方式,因为:

  1. 它使用实际的文件,减慢测试速度-应该返回一个类似文件的对象
  2. 它是不可配置的-应该给它的构造函数一个文件名(或内容)。在

相关问题 更多 >