9

モックと@patchデコレータを使用してPythonアプリケーションのテストを作成しようとしています。

次のディレクトリ構造が与えられます。

  |-- mypackage
  |   |-- mymodule
  |   |   |-- __init__.py
  |   |   \-- somefile.py
  |   \-- myothermodule
  |       |-- tests
  |       |   |-- __init__.py
  |       |   \-- test_func_to_test.py
  |       \-- __init__.py
  \-- __init__.py

ファイルの内容は次のとおりです。


#mypackage/mymodule/somefile.py

def some_function():
    return 'A'

#mypackage/myothermodule/__init__.py

from mypackage.mymodule.somefile import some_function

def func_to_test():
    return some_function()

#mypackage/myothermodule/tests/test_func_to_test.py

from unittest import TestCase
from mock import patch

class TestFunc_to_test(TestCase):
    def test_func_to_test(self):
        from mypackage.myothermodule import func_to_test
        self.assertEqual('A', func_to_test())

    @patch('mypackage.mymodule.somefile.some_function')
    def test_func_to_test_mocked(self, some_mock_function):
        from mypackage.myothermodule import func_to_test
        some_mock_function.return_value = 'B'
        self.assertEqual('B', func_to_test())

私が抱えている問題は、最初のテストは合格(test_func_to_test)しますが、2番目のテスト(test_func_to_test_mocked)は合格しない(AssertionErrorのため)ということです。

同じアプローチを使用して、「組み込み」モジュール(requests.getなど)から関数をモックすることができましたが、いずれかの関数にパッチを適用しようとすると、@patchが機能しないようです。モジュール..。

どんな助けもいただければ幸いです:)

4

1 に答える 1

29

mypackage.myothermoduleはすでにインポートされているため、名前some_functionはすでにそのモジュール内にバインドされています。呼び出し元のモジュール内でその名前の使用法を模倣する必要があります。

@patch('mypackage.myothermodule.some_function')

または、リロードすることもできますmypackage.myothermodule

import mypackage.myothermodule
reload(mypackage.myothermodule)
于 2013-02-01T20:00:44.233 に答える