2017-05-04 55 views
0

這是一些單元測試,我已經減少到一個重現問題的最小例子。爲什麼我的模擬對象不能識別任何呼叫?

import unittest 
import zipfile 
from unittest.mock import patch 

"""My 'production' function""" 
def list_txt_in_zipfile(zip_file_path): 
    with open(zip_file_path, "rb") as file: 
     zf = zipfile.ZipFile(file) 
     print("zipfile.ZipFile is", zipfile.ZipFile) 
    return [f_name for f_name in zf.namelist() if f_name.endswith(".txt")] 


class UnzipperTest(unittest.TestCase): 

    """My test method""" 
    @patch("__main__.zipfile.ZipFile") 
    def test_list_txt_in_zipfile(self, mock_ZipFile): 
     txt_list = list_txt_in_zipfile("my.txt.zip") 
     mock_ZipFile.assert_any_call() # AssertionError 
     print("mock_ZipFile is", mock_ZipFile) 


if __name__ == '__main__': 
    unittest.main() 

的Asse田:

AssertionError: ZipFile() call not found 

當我的測試方法調用它記錄模擬對象,不是真正的zipfile.Zipfilelist_txt_in_zipfile(從Python的zipfile.py)。

如果我在我的測試方法打印在我的生產函數和mock_ZipFile那些「二」的對象zipfile.ZipFile,它們是相同的對象:

zipfile.ZipFile is <MagicMock name='ZipFile' id='3069297420'> 
mock_ZipFile is <MagicMock name='ZipFile' id='3069297420'> 

爲什麼mock_ZipFile無法斷言它的任何電話?

其實我已經成功地通過拆分成兩個功能(在open()部分和zipfile.ZipFile()其餘測試list_txt_in_zipfile功能,但目前的情況是,這是不是一個巨大的功能,所以我想保持這片。在一個地方

更新邏輯的:在測試方法的my.txt.zip確實存在,我沒有設法在unittest.mock.mock_open帶給模擬出open(),因爲我被困與嘲諷了zipfile.ZipFile

回答

3

assert_any_call斷言。模擬對象被稱爲與指定參數。你沒有在你的斷言中傳遞任何參數,但在函數本身zipfile.Zipfile()被調用一個參數,一個文件對象。

+0

有效的點。實際上,我很難找到要在orignal assert_called_once_with中放置什麼,所以我錯誤地認爲assert_any_call是一個通過給定的參數列表的方法。 –

+0

help()還說_「如果模擬已經被調用,assert會通過,不像 'assert_called_with'和'assert_called_once_with'只有在 這個調用是最近的時候纔會通過。」_ –

+0

同樣,與第一句相結合,這意味着「永遠(具有特定的論點)」。如果你只是想聲明它已被調用,請使用'assert_called()' –

相關問題