我正在为机器人开发软件,该软件通常在 Raspberry Pi 上运行。让我们考虑两个文件的导入:
motor.py
(运行电机):
from RPi import GPIO as gpio
and client.py
(与服务器通信并将命令转发给电机):
from rpi.motor import Motor
这两个文件都位于名为的目录中rpi
,其中包含一个__init__.py
and a __main__.py
. The RPi
软件包无法安装在非 RPi 设备上。不过我还是想测试一下功能client.py
.
import unittest
from unittest import mock
# Location A
class TestClient(unittest.TestCase):
# Location B
setUp(self):
# Location C
pass
本来,我尝试过from rpi.client import Client
在 LocA 上,但失败了,因为它尝试导入 Motor,然后从 RPi 导入 GPIO,而 RPi 不存在。我也尝试过mock.patch("rpi.client.Motor")
在 LocB(包括添加mock_motor
after self
,并导入Client
在 LocC,但这也失败了。我尝试嘲笑RPi
在 LocA 也有,但也没有成功。
如何模拟系统上未安装的库?
您可以使用patch.dict() https://docs.python.org/3/library/unittest.mock.html#patch-dict打补丁sys.modules
并嘲笑RPi
模块如指定文档中所示。
在测试模块顶部使用以下代码:
>>> from mock import MagicMock, patch
>>> mymodule = MagicMock()
>>> patch.dict("sys.modules", RPi=mymodule).start()
>>> from RPi import GPIO as gpio
>>> gpio
<MagicMock name='mock.GPIO' id='139664555819920'>
>>> import os
>>> os
<module 'os' from '/usr/lib/python2.7/os.pyc'>
在Python3中你有同样的行为。
在您的具体情况下使用patch.dict
有点矫枉过正了;也许您对补丁上下文和原始状态恢复不感兴趣。所以你可以通过set来简化它sys.modules["RPi"]
直接地:
>>> from unittest.mock import MagicMock
>>> mymodule = MagicMock()
>>> import sys
>>> sys.modules["RPi"] = mymodule
>>> from RPi import GPIO as gpio
>>> gpio
<MagicMock name='mock.GPIO' id='140511459454648'>
>>> import os
>>> os
<module 'os' from '/usr/lib/python3.4/os.py'>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)