如何模拟在单独的命名空间中使用的类?

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类中的所有方法?

Mar*_*ers 5

Lm来自哪里并不重要.您导入Lmpqr.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文档.