San*_*ket 3 python namespaces mocking python-2.7 python-unittest
包装结构:
pqr/pq.py
test.py
Run Code Online (Sandbox Code Playgroud)
pqr/pq.py 有以下结构
其中lmn是全局安装的pip模块
结构 pq.py
from lmn import Lm
class Ab():
def __init__(self):
self.lm = Lm()
def echo(self, msg):
print msg
Run Code Online (Sandbox Code Playgroud)
test.py 有以下结构
from pqr.pq import Ab
Run Code Online (Sandbox Code Playgroud)
如何Lm()在这里模拟类以便测试Ab类中的所有方法?
Lm来自哪里并不重要.您导入Lm到pqr.pq命名空间为全局有,所以你只需要更换的名字里有和其他地方.那是因为该Ab.__init__方法将在它自己的模块中"本地"查找它.
因此,使用mock库您需要做的就是修补名称pqr.pq.Lm:
import mock
from pqr.pq import Ab
with mock.patch('pqr.pq.Lm') as mock_lm:
# within this block, `Lm` in the `pqr.pq` namespace has been replaced
# by a mock object
test_instance = Ab()
# assert that the patch succeeded; .return_value is used because
# Ab.__init__ *calls* Lm()
assert test_instance.lm is mock_lm.return_value
Run Code Online (Sandbox Code Playgroud)
还看到哪里修补部分的的mock文档.