模拟ftplib.FTP用于单元测试Python代码

塔默兹

我不知道为什么我没有得到这个,但是我想在Python中使用模拟来测试我的函数是否正确调用了ftplib.FTP中的函数。我已经简化了所有步骤,但仍然没有将其工作全神贯注。这是一个简单的示例:

import unittest
import ftplib
from unittest.mock import patch

def download_file(hostname, file_path, file_name):
    ftp = ftplib.FTP(hostname)
    ftp.login()
    ftp.cwd(file_path)

class TestDownloader(unittest.TestCase):

    @patch('ftplib.FTP')
    def test_download_file(self, mock_ftp):
        download_file('ftp.server.local', 'pub/files', 'wanted_file.txt')

        mock_ftp.cwd.assert_called_with('pub/files')

运行此命令时,我得到:

AssertionError: Expected call: cwd('pub/files')
Not called

我知道它必须使用模拟对象,因为那是一个伪造的服务器名称,并且在不打补丁的情况下运行时,它将引发“ socket.gaierror”异常。

如何获得功能正在运行的实际对象?长期目标不是在同一文件中具有“ download_file”功能,而是从单独的模块文件中调用它。

米歇尔·达米科

当您patch(ftplib.FTP)在修补FTP构造函数时。dowload_file()使用它来构建 ftp对象,这样您ftp调用login()和的对象cmd()mock_ftp.return_value代替mock_ftp

您的测试代码应遵循:

class TestDownloader(unittest.TestCase):

    @patch('ftplib.FTP', autospec=True)
    def test_download_file(self, mock_ftp_constructor):
        mock_ftp = mock_ftp_constructor.return_value
        download_file('ftp.server.local', 'pub/files', 'wanted_file.txt')
        mock_ftp_constructor.assert_called_with('ftp.server.local')
        self.assertTrue(mock_ftp.login.called)
        mock_ftp.cwd.assert_called_with('pub/files')

我添加了所有支票,autospec=True只是因为这是一个好习惯

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章