Ich versuche paramiko SFTPClient.open() zu verhöhnen und eine Datei zurückgeben, um meine Datei Parsing-Code zu testen. Jedoch, wenn ich meinen Mock wie folgt aufstelle, wird eine magicmock-Instanz anstelle der geöffneten Datei zurückgegeben, deren _mock_return_value der geöffneten Datei entspricht.Python spöttisch paramiko sftpclient offen
Ich möchte die paramiko.SSHClient.open_sftp.open gleich der offenen Testdatei. Ich denke, das sollte passieren, aber es ist nicht so. Fehle ich etwas? Kann mir jemand erklären, was ich falsch mache und wie ich das falsch verstehe?
Dies ist mein Code:
@app.route('/ipmivlan/<girls_name>', methods=['POST'])
def find_the_girl(girls_name):
this_is_the_girl = None
remote_file = None
try:
client = paramiko.SSHClient()
# Auto add host key if not found/unknown
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host, username=username, password=password)
sftp_client = client.open_sftp()
remote_filename = '/usr/local/{0}'.format(girls_name.lower())
remote_file = sftp_client.open(remote_filename, mode='r')
print remote_file
pprint(remote_file.__dict__)
this_is_the_girl = parse_config(remote_file)
except paramiko.ssh_exception.AuthenticationException:
return_message = "Authentication has failed."
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.BadHostKeyException:
return_message = "Server hostkey could not be verified"
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.SSHException:
return_message = "Error connecting or establishing SSH Session."
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except paramiko.ssh_exception.socket.error:
return_message = "Socket error occurred while connecting."
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except IOError:
return_message = "IOError while trying to read remote file {0}".format(remote_filename)
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
except:
return_message = "Unknown exception: {0}".format(str(sys.exc_info()[0]))
app.logger.info(return_message)
app.logger.info("Traceback: {0}".format(traceback.format_exc()))
return jsonify(return_code=1, message=return_message, traceback=traceback.format_exc())
finally:
if remote_file is not None:
remote_file.close()
if this_is_the_girl is None:
return jsonify(return_code=0, message="Girl not found.")
elif this_is_the_girl == 'this is the girl:
return jsonify(return_code=0, message="Successfully found girl")
elif this_is_the_girl == 'it's no longer your film, this is the girl.'
return jsonify(return_code=50, message="GG no re.")
def parse_config(self, file):
this_is_the_girl = None
for line in file:
# print line
if re.findall('what girl, for what? what is this ray?', line):
return "this is the girl"
elif re.findall('that is considered one of the finest espressos in the world', line):
return "it's no longer your film, this is the girl."
Hier mein Testcode ist:
def setUp(self):
self.test_file = open('this_is_the_girl_test_data.txt')
@mock.patch('src.mulholland.paramiko')
def test_find_girl(self, paramiko):
expected_return_code = 0
expected_message = "Successfully found girl"
paramiko.SSHClient().open_sftp().open().return_value = self.test_file
response = self.app.post('/mulholland_drive/{0}'.format(self.girl), data=dict(username=self.username, password=self.password), follow_redirects=True)
response_json = json.loads(response.data)
self.assertEqual(expected_return_code, response_json['return_code'])
self.assertEqual(expected_message, response_json['message'])
def tearDown(self):
self.test_file.close()
Dies ist, was mein Test liefert:
<MagicMock name='paramiko.SSHClient().open_sftp().open()' id='4426176848'>
{'__str__': <MagicMock name='paramiko.SSHClient().open_sftp().open().__str__' id='4426525136'>,
'_mock_call_args': None,
'_mock_call_args_list': [],
'_mock_call_count': 0,
'_mock_called': False,
'_mock_children': {'__str__': <MagicMock name='paramiko.SSHClient().open_sftp().open().__str__' id='4426525136'>},
'_mock_delegate': None,
'_mock_methods': None,
'_mock_mock_calls': [call.__str__()],
'_mock_name': None,
'_mock_new_name': '()',
'_mock_new_parent': <MagicMock name='paramiko.SSHClient().open_sftp().open' id='4426130896'>,
'_mock_parent': None,
'_mock_return_value': <open file 'this_is_the_girl_test_data.txt', mode 'r' at 0x107ab1930>,
'_mock_side_effect': None,
'_mock_unsafe': False,
'_mock_wraps': None,
'_spec_class': None,
'_spec_set': None,
'_spec_signature': None,
'method_calls': []}