2016-05-03 29 views
0

私は、pysftpモジュールをいくつか呼び出すSFTPヘルパクラスを単体テストしようとしています。 pysftpからの実際のネットワーク呼び出しを模擬して、副作用がないようにして、クラスが正しいparamatersを使って基礎となるSFTPメソッドを正しく呼び出していることを確認してください。ここで単体テストでのPythonクラスの模擬とインスタンスの検証

は、これまでの私のコードの簡単な例です:

import pysftp 
import unittest 
import mock 

class SFTPHelper(object): 
    def __init__(self, host, username, password, files_dir): 
     self.host = host 
     self.username = username 
     self.password = password 
     self.files_dir = files_dir 

    def list_files(self): 
     with pysftp.Connection(
       self.host, 
       username=self.username, 
       password=self.password) as sftp: 
      return sftp.listdir(self.files_dir) 

class TestSFTPHelper(unittest.TestCase): 
    @mock.patch('pysftp.Connection') 
    def test_list_files(self, mock_connection): 
     sftp_helper = SFTPHelper('somehost', 'someuser', 'somepassword', '/some/files/dir') 
     sftp_helper.list_files() 

     # this assertion passes 
     mock_connection.assert_called_with(
      'somehost', password='somepassword', username='someuser') 

     # this assertion does not pass 
     mock_connection.listdir.assert_called_with('/some/files/dir') 

アサーションエラー:

AssertionError: Expected call: listdir('/some/files/dir') 
Not called 

私は関数が呼び出されたことを主張する必要があるので、それが動作しないと仮定します私のメソッドで使用されていたpysftp.Connectionのインスタンスを取得するにはどうすればよいですか?

+0

1.あなたは* * "動作しない" より明確に問題の説明を与えることができますか?あなたは*コンテキストマネージャー*を模倣しようとしています、あなたはそれを読んでください。 – jonrsharpe

+0

@jonrsharpeがアサーションエラー –

+0

@ dnit13で修正されました。単にstackoverflowの質問でタイプミスがありました。私は実際のコードでそれをやっています。固定された –

答えて

1

__enter____exit__メソッドが定義された新しいモックオブジェクトを返すようにモックを設定できます。また

@mock.patch.object(
    target=pysftp, 
    attribute='Connection', 
    autospec=True, 
    return_value=mock.Mock(
     spec=pysftp.Connection, 
     __enter__=lambda self: self, 
     __exit__=lambda *args: None 
    ) 
) 
def test_list_files(self, mock_connection): 
    # (contents of test case) 

、あなたが使用したい場合があります:たとえば

mock_connection.return_value.listdir.assert_called_with('/some/files/dir') 

の代わり:

mock_connection.listdir.assert_called_with('/some/files/dir') 

側の注意点として、あなたはまたにassert_called_withの両方の使用を置き換えることができますあなたの例はassert_called_once_withです。

最終結果:

$ python -m unittest test_sftp_helper.TestSFTPHelper.test_list_files 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.017s 

OK 
関連する問題