2017-05-04 54 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()' –

相关问题