簡體   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