2016-12-14 6 views
0

をTestClassを猿のpython機能パッチ - 私は別のモジュールからPythonの機能を交換するトラブルによ問題

私は、モジュール内の関数が含まれている私のコードの一部をテストしようとしています。より詳細には、私はこの機能をサルパッチしたいと思います。

ので、状況は次のようになります。モジュールで

機能

def function_in_module(): 
    # do some stuff 
    return 'ok' 

私は

from dir_1.dir_2.dir_3.module_name import function_in_module 
class ExampleClass(): 
    def __init__(self): 
     # do some stuff 
     self.var_x = function_in_module() 
     # do some stuff again 

をテストしたいと思います私のコードの一部テストクラス

from dir_1.dir_2.dir_3 import module_name 
class TestClass(TestCase): 
    de_monkey = {} 
    mp = None 

    def setUp(self): 
     # save original one 
     self.de_monkey['function_in_module'] = module_name.function_in_module() 
     if self.mp is None: 
      self.mp = MP() 

    def tearDown(self): 
     # rollback at the end 
     module_name.function_in_module = self.de_monkey['function_in_module'] 

    def test_string(self): 
     module_name.function_in_module = self.mp.monkey_function_in_module 
     test_obj = ExampleClass() 
     self.assertEqual(test_obj.var_x, 'not ok') 

class MP(object): 

    @staticmethod 
    def monkey_function_in_module(self): 
     return 'not ok' 

アサルトステートメントが示すとおり、期待される結果は「not ok」ですが、結果は「ok」です。

これについてデバッグしましたが、この猿パッチが機能しないため、関数を呼び出す別の方法が理由です。私はこのようにでExampleClassで関数を呼び出すようにしようとした場合、実際には

は、

self.var_x = module_name.function_in_module() 

は正常に動作します。

私には何が欠けていますか?多分それは陳腐だが、

答えて

1

あなたのコードを直接テスト輸入function_in_moduleと言及、それを下に事前にありがとう狂気私を運転です。 module_name.function_in_moduleの値を変更しても、コードには影響しません。

ソースモジュールではなく、テスト対象のコードを含むモジュールで直接関数を置き換える必要があります。

mockライブラリを使用した方が簡単ですが、パッチを適用する場所は変わりません。

+0

関連して、OPはまた、問題の関数を呼び出してその戻り値を保存し、関数自体を保存しません。 – chepner

+0

申し訳ありません@Daniel、この 'function_in_module = self.mp.monkey_function_in_module'のように' def test_string'で 'function_in_module'を呼び出す必要があるのですか、それともわかりませんか? – Giordano

+0

いいえ、まったくありません。 'module_that_defines_ExampleClass.function_in_module = ...'を実行する必要があります。また、どのようなchepnerも言ったことに注意してください。 –

関連する問題