如何使用 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')