2016-04-26 36 views
1

我想模擬paramiko SFTPClient.open()並返回一個文件來測試我的文件解析代碼。然而,當我如下設置我的Mock時,它會返回一個magicmock實例,而不是打開的文件,它的_mock_return_value等於打開的文件。Python嘲諷paramiko sftpclient打開

我想讓paramiko.SSHClient.open_sftp.open等於打開的測試文件。我覺得這應該發生,但事實並非如此。我錯過了什麼嗎?任何人都可以解釋,我做錯了什麼,以及我是如何誤解模擬的?

這是我的代碼:

@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." 

這裏是我的測試代碼:

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() 

這是我的測試返回:

<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': []} 

回答

2

對於所有關心,我有弄清楚了。當我通過線路返回一個迭代,所以我實際上需要模擬iter

paramiko.SSHClient().open_sftp().open().return_value = self.test_file 

需要進行

paramiko.SSHClient().open_sftp().open().__iter__.return_value = self.test_file