を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()
は正常に動作します。
私には何が欠けていますか?多分それは陳腐だが、
が
関連して、OPはまた、問題の関数を呼び出してその戻り値を保存し、関数自体を保存しません。 – chepner
申し訳ありません@Daniel、この 'function_in_module = self.mp.monkey_function_in_module'のように' def test_string'で 'function_in_module'を呼び出す必要があるのですか、それともわかりませんか? – Giordano
いいえ、まったくありません。 'module_that_defines_ExampleClass.function_in_module = ...'を実行する必要があります。また、どのようなchepnerも言ったことに注意してください。 –