修补在另一个函数中导​​入的函数

时间:2014-03-05 15:09:34

标签: python unit-testing testing mocking python-unittest

为了避免循环导入,我被迫定义一个看起来像这样的函数:

# 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:

但这产生了类似的错误。有没有办法模拟这个函数,因为我被迫在它使用的函数中导入它?

1 个答案:

答案 0 :(得分:24)

你应该嘲笑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')

希望有所帮助。