如何解决Python修补FTP导入
我正在尝试为ftp下载器编写单元测试。由于某种原因,我的导入未打补丁。我可以看到在调试ftp对象时,它是一个真实的FTP对象,而不是模拟对象。我在pytest中使用Python 3.5。
这是我的代码:
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_my_awesome_test.py
如果我将补丁程序更改为:@patch('tagging.tests.unit.test_my_awesome_test.FTP',autospec=True)
,它仍然无法正常工作
解决方法
问题出在这里,您正在修补同一文件中的类。 where to patch中提到的默认方法适用于与测试文件分开的源文件(通常情况)。如果源代码与测试文件位于同一文件中,则可以将patch.object
与当前模块一起使用:
class TestMyAwesomeTest:
@patch.object(sys.modules[__name__],'FTP',autospec=True)
def test_get_listing(self,mocked_ftp):
mocked_ftp.return_value.nlst.return_value = ['abc.csv']
ftp_downloader = FTPDownloader()
listing = ftp_downloader.get_listing('ftp://foo.bar','user','password')
assert listing == ['abc.csv']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。