如何使用 python 中的补丁模拟 python 库,无论它在哪里使用?
How to mock a python library using patch in python regardless where it is used?
在下面的问题中,使用 ftplib 的函数在同一个文件中定义,这使得打补丁变得微不足道('ftplib.FTP')
我的问题是:如果在我的测试中,我想创建一个 class(我们称它为 'A')的实例,它在某处使用 ftplib(即: class A 有一个 class B 的实例,B 有一个 FTP 调用 connect()) 的对象 ?
import unittest
from mock import patch
class TestClass(unittest.TestCase):
@patch(???)
def test_1(self, mock_ftp_constructor):
mock_ftp = mock_ftp_constructor.return_value
a = A()
self.assertTrue(mock_ftp.connect.called)
if __name__ == "__main__":
unittest.main()
如果我使用另一个问题中给出的解决方案,我发现调用的是 ftplib 而不是 mock。我怎么知道 ftplib.FTP 的正确路径?
在处理导入以模拟 class 时,重要的是文件(class 所在的位置)导入库的方式。
要制作补丁,必须知道调用 lib 的上下文的 名称。
如果 __name__ 是 'A.B'
,则补丁将是:如果 B 将 FTP 导入为 import ftplib
,则补丁将是 @patch('A.B.ftplib.FTP')
。
如果 B 将库导入为 from ftplib import FTP
,它将是:@patch('A.B.FTP')
在下面的问题中,使用 ftplib 的函数在同一个文件中定义,这使得打补丁变得微不足道('ftplib.FTP')
我的问题是:如果在我的测试中,我想创建一个 class(我们称它为 'A')的实例,它在某处使用 ftplib(即: class A 有一个 class B 的实例,B 有一个 FTP 调用 connect()) 的对象 ?
import unittest
from mock import patch
class TestClass(unittest.TestCase):
@patch(???)
def test_1(self, mock_ftp_constructor):
mock_ftp = mock_ftp_constructor.return_value
a = A()
self.assertTrue(mock_ftp.connect.called)
if __name__ == "__main__":
unittest.main()
如果我使用另一个问题中给出的解决方案,我发现调用的是 ftplib 而不是 mock。我怎么知道 ftplib.FTP 的正确路径?
在处理导入以模拟 class 时,重要的是文件(class 所在的位置)导入库的方式。
要制作补丁,必须知道调用 lib 的上下文的 名称。
如果 __name__ 是 'A.B'
,则补丁将是:如果 B 将 FTP 导入为 import ftplib
,则补丁将是 @patch('A.B.ftplib.FTP')
。
如果 B 将库导入为 from ftplib import FTP
,它将是:@patch('A.B.FTP')