1

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

模拟 ftplib.FTP 以对 Python 代码进行单元测试

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

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 的正确路径?

4

1 回答 1

2

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

要制作补丁,必须知道调用 lib 的上下文的名称。如果 __name__ 是'A.B',补丁将是:@patch('A.B.ftplib.FTP')如果 B 将 FTP 导入为import ftplib. 如果 B 将 lib 导入为from ftplib import FTP,它将是:@patch('A.B.FTP')

于 2017-05-16T14:37:32.250 回答