2017-10-26 13 views
0

クラスオブジェクトが正しく作成されていることを確認するユニットテストを作成しています。このオブジェクトはs3からコンテンツを取得することに依存しています。私はその中にS3を呼び出す関数をモックとしたい完全,:私が別のライブラリファイルで定義されている機能の_call_to_s3をモックするにはどうすればよいinitメソッド内のモック関数呼び出しPython

class SomeClassTest(unittest.TestCase): 

    @patch('someDir.util._call_to_s3') 
    def test_someclass_load(self, magic_mock): 
     magic_mock.return_value = {"host": "bogus.com"} 
     some_class = SomeClass() 

     self.assertGreater(len(some_class), 0) 

class SomeClass(): 

    def __init__(): 
     try: 
      content = _call_to_s3(bucket_name, file_name) 
     except: 
      rest of code ... 

答えて

0

あなたがmonkeypatchしたときに、異なる値を指すように名前を変更しています。あなたは価値そのものを変えていません。鍵は、テストしているユニットが使用している名前にパッチを当てることです。

「fooインポートバーから」を実行するたびに、名前の新しいローカルコピーが作成されます。この場合、SomeClassがsomeDir.utilモジュールにないように見えます。いくつかのディレクトリにあるとしましょう.other_mod

someDir.other_modは "from someDir.util import _call_to_s3"のような処理をします。 someDir.other_mod._call_to_s3という新しい名前が作成されます。これはSomeClassが使用する名前なので、パッチを当てる必要があります。

@patch( 'someDir.other_mod._call_to_s3')

特定の値を指すすべての名前にパッチを当てる方法はありません。

関連する問題