Python模拟函数和导入模拟

时间:2017-10-24 14:01:37

标签: python python-2.7 unit-testing dependency-injection mocking

在我的测试文件中,我想模拟一个模块中包含的辅助函数。我能够成功地#39; (即没有编译或运行时错误,因为一切都正确链接)模拟函数,但模拟不会渗透到我正在测试的类。

我已经研究了依赖注入,但我不确定如何注入我的模块,它现在只有一个函数被模拟。最终我计划嘲笑几乎所有的功能;我只想先让基线工作。

这是我到目前为止所拥有的

class FooTestCase(unittest.TestCase):

    @mock.patch('modules.MyHelperModule.helper_function')
    def test_simple(self, mock_hf):

        my_obj = MyObj()

        # internally, this class imports HelperModule 
        # and the method calls helper_function with 1
        my_obj.do_something()

        mock_hf.helper_function.assert_called_with(1)

        return

assert命令失败并报告从未调用过该方法。我假设模拟从未通过my_obj。

据我所知,我可以在MyObj的init方法中创建一个标志,例如testing = False并相应地导入模块,但是如何导入仅在测试文件中模拟的模块?这是我现在正在考虑的方法,但我对其他实现方式持开放态度,这得到了相同的结果。

回应Daniel Roseman的评论

在MyOBJ中,我有以下一行

from modules.HelperModule import helper_function

但是,我收到了错误

ImportError: No module named modules

我的补丁线现在看起来像

@mock.patch('MyObj.modules.HelperModule.helper_function')

任何帮助总是受到赞赏;谢谢!

2 个答案:

答案 0 :(得分:1)

我想问题是mock_hf不是你要补丁的。 试试:

from unittest.mock import patch
class FooTestCase(unittest.TestCase):


def test_simple(self):
    with patch('modules.MyHelperModule.helper_function') as mock_hf:
        my_obj = MyObj()
        my_obj.do_something()
        mock_hf.assert_called_with(1)

答案 1 :(得分:0)

正如丹尼尔罗斯曼对我原帖的评论所述,问题出在我修补的地方。

我应该修补MyObj.helper_function。另外,我在 init .py中,从MyObj导入MyObj。这导致我只能在我的测试中引用MyObj类,但我需要覆盖整个文件的helper_function。我不得不删除那条线。