Я не знаю, почему я просто не понимаю этого, но я хочу использовать mock в 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» находилась в том же файле, а в том, чтобы вызывать ее из отдельного файла модуля.