在我的测试文件中,我想模拟一个模块中包含的辅助函数。我能够成功地#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')
任何帮助总是受到赞赏;谢谢!
答案 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。我不得不删除那条线。