У меня есть метод таким образом:
def ftp_fetch(self, hostname=None, username=None, password=None, file_name=None):
source_data = ''
if hostname and username and password and file_name:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname, username=username, password=password)
except paramiko.SSHException:
print("Connection Error")
sftp = ssh.open_sftp()
source_data = json.loads(
sftp.file(file_name).read()
)
ssh.close()
return source_data
return False
... и тест таким образом:
@patch('paramiko.SSHClient')
def test_ftp_fetch(mock_ssh):
test_content = '{"date": "06/02/2020", "time": "07:55", "floors":[{"floor": "地面", "capacity": 149, "occupancy": "20"},{"floor": "قبو", "capacity": 184, "occupancy": "20"}]}'
mock_ssh.open_sftp().file().read().return_string = test_content
foo = PreProcessor(code="foo")
response = foo.ftp_fetch()
assert response == False
response = foo.ftp_fetch(hostname='http://foo/', username='foo', password = 'bar', file_name = 'baz')
assert response == json.loads(test_content)
Независимо от того, что я пытался сделать с макетом Я получаю ту же ошибку:
___________________________________________________________________________ test_ftp_fetch ___________________________________________________________________________
mock_ssh = <MagicMock name='SSHClient' id='139650132358312'>
@patch('paramiko.SSHClient')
def test_ftp_fetch(mock_ssh):
test_content = '{"date": "06/02/2020", "time": "07:55", "floors":[{"floor": "地面", "capacity": 149, "occupancy": "20"},{"floor": "قبو", "capacity": 184, "occupancy": "20"}]}'
mock_ssh.open_sftp().file().read().return_string = test_content
foo = PreProcessor(code="foo")
response = foo.ftp_fetch()
assert response == False
> response = foo.ftp_fetch(hostname='http://foo/', username='foo', password = 'bar', file_name = 'baz')
preprocessors/test_preprocessors.py:339:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
preprocessors/preprocessors.py:229: in ftp_fetch
sftp.file(file_name).read()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
s = <MagicMock name='SSHClient().open_sftp().file().read()' id='139650131723376'>, encoding = None, cls = None, object_hook = None, parse_float = None
parse_int = None, parse_constant = None, object_pairs_hook = None, kw = {}
<< snip lots of doc text >>
if isinstance(s, str):
if s.startswith('\ufeff'):
raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",
s, 0)
else:
if not isinstance(s, (bytes, bytearray)):
raise TypeError('the JSON object must be str, bytes or bytearray, '
> 'not {!r}'.format(s.__class__.__name__))
E TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'
/usr/lib/python3.6/json/__init__.py:348: TypeError
Итак, мой вопрос прост:
Как настроить макет так, чтобы чтение sftp возвращало определенный текст? (Я использую python 3.6 & pytest)
((и да, я всегда стараюсь проверять текст Юникода высокого порядка, даже если не ожидаю его при обычном использовании))