2016-04-26 29 views
1

私はparamiko SFTPClient.open()を模倣し、ファイル解析コードをテストするためにファイルを返そうとしています。しかし、以下のようにMockをセットアップすると、開いているファイルの代わりにmagicmockインスタンスが返され、_mock_return_valueは開いたファイルと同じになります。Python mocking paramiko sftpclient open

私は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

、理解した。私が線を通って行くとき、iterableを返しているので、私は実際に模擬する必要がありますiter

paramiko.SSHClient().open_sftp().open().__iter__.return_value = self.test_file 
する必要が

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