iko*_*tia 7 python mocking python-mock
让我们假设我们有一个仅在生产阶段存在的模块系统.在测试时,这些模块不存在.但我仍然想为使用这些模块的代码编写测试.我们还假设我知道如何从这些模块中模拟所有必需的对象.问题是:如何方便地将模块存根添加到当前层次结构中?
这是一个小例子.我想测试的功能放在一个名为的文件中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)
Run Code Online (Sandbox Code Playgroud)
在我的测试套件中,我已经拥有了我需要的一切:我拥有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()
Run Code Online (Sandbox Code Playgroud)
我知道我可以替换sys.modules['level1']包含另一个对象的对象,依此类推.但对我来说似乎有很多代码.我认为必须有更简单,更漂亮的解决方案.我找不到它.
iko*_*tia 11
所以,没有人帮我解决我的问题,我决定自己解决.这是一个微型lib surrogate,允许用户为不存在的模块创建存根.
Lib可以mock像这样使用:
from surrogate import surrogate
from mock import patch
@surrogate('this.module.doesnt.exist')
@patch('this.module.doesnt.exist', whatever)
def test_something():
from this.module.doesnt import exist
do_something()
Run Code Online (Sandbox Code Playgroud)
首先,@surrogate装饰器为不存在的模块创建存根,然后@patch装饰者可以改变它们.正如@patch,@surrogate装饰可用于"在多个",从而磕碰多于一个模块的路径.所有存根仅在修饰函数的生命周期中存在.
如果有人使用这个lib,那会很棒:)
| 归档时间: |
|
| 查看次数: |
1226 次 |
| 最近记录: |