如何在python中使用补丁模拟python库,而不管它在哪里使用?

如何在python中使用补丁模拟python库,而不管它在哪里使用?,python,unit-testing,ftp,mocking,magicmock,Python,Unit Testing,Ftp,Mocking,Magicmock,在下面的问题中,使用ftplib的函数在同一个文件中定义,这使得修补('ftplib.FTP')变得很简单 我的问题是:如果在我的测试中,我想创建一个在某处使用ftplib的类(我们称之为“a”)的实例(即:类a有一个类B的实例,而B有一个调用connect()的FTP对象),我应该如何继续 如果我使用另一个问题中给出的解决方案,我发现调用ftplib而不是mock。我如何知道ftplib.FTP的正确路径?在处理模拟类的导入时,重要的是文件(类所在的位置)如何导入库 要制作补丁,需要知道调用

在下面的问题中,使用ftplib的函数在同一个文件中定义,这使得修补('ftplib.FTP')变得很简单

我的问题是:如果在我的测试中,我想创建一个在某处使用ftplib的类(我们称之为“a”)的实例(即:类a有一个类B的实例,而B有一个调用connect()的FTP对象),我应该如何继续


如果我使用另一个问题中给出的解决方案,我发现调用ftplib而不是mock。我如何知道ftplib.FTP的正确路径?

在处理模拟类的导入时,重要的是文件(类所在的位置)如何导入库

要制作补丁,需要知道调用lib的上下文的名称。 如果uuu name_uuuu是
'A.B'
,那么如果B作为
导入ftplib
导入FTP,则补丁将是:
@patch('A.B.ftplib.FTP')

如果B从ftplib import FTP以
的形式导入lib,它将是:
@patch('A.B.FTP')

Hi这
A
B
代表什么?我可以只使用
@patch('ftplib.FTP_TLS')
?我这里有一个问题:如果你能帮我看一下,我将不胜感激,谢谢
a
B
代表项目内部的包。修补路径时,实际上是修补文件中的引用。如果您有一个python包
a
,它有一个python包
B
B
中的代码,那么您使用的是ftplib,您必须模拟它,而不是ftplib本身。记住检查内置名称,以了解您在通话时的位置
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()