web-dev-qa-db-ja.com

別の関数内にインポートされた関数にパッチを適用する

循環インポートを回避するために、次のような関数を定義する必要がありました。

# do_something.py

def do_it():
    from .helpers import do_it_helper
    # do stuff

ここで、do_it_helperにパッチを適用して、この関数をテストできるようにしたいと思います。インポートがトップレベルのインポートであった場合、

class Test_do_it(unittest.TestCase):
    def test_do_it(self):
        with patch('do_something.do_it_helper') as helper_mock:
            helper_mock.return_value = 12
            # test things

うまくいくでしょう。ただし、上記のコードは私に与えます:

AttributeError: <module 'do_something'> does not have the attribute 'do_it_helper'

気まぐれで、パッチステートメントを次のように変更してみました。

with patch('do_something.do_it.do_it_helper') as helper_mock:

しかし、それは同様のエラーを引き起こしました。それが使用されている関数内にインポートすることを余儀なくされているという事実を考えると、この関数をモックする方法はありますか?

22
Wilduck

_helpers.do_it_helper_をモックアウトする必要があります:

_class Test_do_it(unittest.TestCase):
    def test_do_it(self):
        with patch('helpers.do_it_helper') as helper_mock:
            helper_mock.return_value = 12
            # test things
_

os.getcwd()でモックを使用する例を次に示します。

_import unittest
from mock import patch


def get_cwd():
    from os import getcwd
    return getcwd()


class MyTestCase(unittest.TestCase):
    @patch('os.getcwd')
    def test_mocked(self, mock_function):
        mock_function.return_value = 'test'
        self.assertEqual(get_cwd(), 'test')
_

お役に立てば幸いです。

36
alecxe