Python修补FTP导入

Python修补FTP导入,python,mocking,pytest,Python,Mocking,Pytest,我正试图为我的ftp下载程序编写一个单元测试。由于某些原因,我的导入没有修补。我可以看到,在调试ftp对象时,它是一个真实的ftp对象,而不是模拟的ftp对象。我将Python3.5与pytest一起使用 这是我的密码: from ftplib import FTP from unittest.mock import patch, MagicMock class FTPDownloader: def get_listing(self, host,user, password):

我正试图为我的ftp下载程序编写一个单元测试。由于某些原因,我的导入没有修补。我可以看到,在调试ftp对象时,它是一个真实的ftp对象,而不是模拟的ftp对象。我将Python3.5与pytest一起使用

这是我的密码:

from ftplib import FTP
from unittest.mock import patch, MagicMock


class FTPDownloader:
    def get_listing(self, host,user, password):
        ftp = FTP()
        ftp.connect(host)
        ftp.login(user, password)
        return ftp.nlst('/')


class TestMyAwesomeTest:

    @patch('ftplib.FTP', autospec=True)
    def test_get_listing(self, mock_ftp_constructor):
        mock_ftp = mock_ftp_constructor.return_value
        mock_ftp.nlst = MagicMock(return_value=['abc.csv'])
        ftp_downloader = FTPDownloader()
        listing = ftp_downloader.get_listing('ftp://foo.bar', 'user', 'password')
        assert listing == ['abc.csv']
运行此命令时,我的错误是:

socket.gaierror: [Errno -2] Name or service not known
如何修复测试/修补程序以成功运行? 非常感谢你的帮助

-编辑- 我的文件位于:
tagging/tests/unit/test\u my\u awesome\u test.py


如果我将修补程序更改为:
@patch('tagging.tests.unit.test\u my\u awome\u test.FTP',autospec=True)
它仍然无法处理相同的错误

问题在于您正在修补同一文件中的类。中提到的默认方法适用于与测试文件分离的源文件(通常情况)。如果源与测试位于同一文件中,则可以将
patch.object
用于当前模块:

class TestMyAwesomeTest:
@对象(sys.modules[\uuuuuuuu name\uuuuuuuu],'FTP',autospec=True)
def test_get_清单(自模拟ftp):
mocked_ftp.return_value.nlst.return_value=['abc.csv']
ftp_downloader=FTPDownloader()
listing=ftp\u downloader.get\u listing('ftp://foo.bar“,”用户“,”密码“)
断言列表==['abc.csv']

如果使用ftlib import FTP中的
,则必须修补该实例(请参阅)。或者,
导入ftplib
并使用
ftplib.FTP