クラス レベル (インスタンスではない) の属性を初期化するために使用されるモジュール レベルの関数をモックしたいと思います。簡単な例を次に示します。
# a.py
def fn():
return 'asdf'
class C:
cls_var = fn()
a.fn() をモックしようとする単体テストを次に示します。
# test_a.py
import unittest, mock
import a
class TestStuff(unittest.TestCase):
# we want to mock a.fn so that the class variable
# C.cls_var gets assigned the output of our mock
@mock.patch('a.fn', return_value='1234')
def test_mock_fn(self, mocked_fn):
print mocked_fn(), " -- as expected, prints '1234'"
self.assertEqual('1234', a.C.cls_var) # fails! C.cls_var is 'asdf'
問題はどこにパッチを当てるかだと思いますが、インポートで両方のバリエーションを試しましたが、うまくいきませんでした。aC がスコープに入る前にモックされた a.fn() が「存在」するように、インポートステートメントを test_mock_fn() に移動しようとしました-いいえ、まだ失敗します。
どんな洞察も大歓迎です!