假设我们有一个只存在于生产阶段的模块系统。在测试这些模块的时刻不存在。但我仍然想为使用这些模块的代码编写测试。我们还假设我知道如何从这些模块中模拟所有必要的对象。问题是:如何方便地将模块存根添加到当前层次结构中?
这是一个小例子。我要测试的功能放在一个名为的文件中actual.py
:
actual.py:
def coolfunc():
from level1.level2.level3_1 import thing1
from level1.level2.level3_2 import thing2
do_something(thing1)
do_something_else(thing2)
在我的测试套件中,我已经拥有了我需要的一切:我拥有thing1_mock
和thing2_mock
. 我还有一个测试功能。我需要的是添加level1.level2...
到当前的模块系统中。像这样:
tests.py
import sys
import actual
class SomeTestCase(TestCase):
thing1_mock = mock1()
thing2_mock = mock2()
def setUp(self):
sys.modules['level1'] = what should I do here?
@patch('level1.level2.level3_1.thing1', thing1_mock)
@patch('level1.level2.level3_1.thing1', thing2_mock)
def test_some_case(self):
actual.coolfunc()
我知道我可以sys.modules['level1']
用包含另一个对象的对象替换,依此类推。但这对我来说似乎有很多代码。我认为必须有更简单和更漂亮的解决方案。我只是找不到它。