未安装的python模拟库和库
我正在为一个机器人开发软件,它通常在树莓皮上运行。让我们考虑两个文件的导入:未安装的python模拟库和库,python,unit-testing,python-3.x,mocking,python-unittest,Python,Unit Testing,Python 3.x,Mocking,Python Unittest,我正在为一个机器人开发软件,它通常在树莓皮上运行。让我们考虑两个文件的导入: motor.py(运行电机): 和client.py(与服务器通信并将命令转发给电机): 这两个文件都位于名为rpi的目录中,该目录包含\uuuu init\uuuuuuuuuuuuuupy和\uuuuuuuuu main.py。RPi软件包不能安装在非RPi设备上。但是,我仍然想测试client.py的功能 import unittest from unittest import mock # Location A
motor.py
(运行电机):
和client.py
(与服务器通信并将命令转发给电机):
这两个文件都位于名为rpi
的目录中,该目录包含\uuuu init\uuuuuuuuuuuuuupy
和\uuuuuuuuu main.py
。RPi
软件包不能安装在非RPi设备上。但是,我仍然想测试client.py
的功能
import unittest
from unittest import mock
# Location A
class TestClient(unittest.TestCase):
# Location B
setUp(self):
# Location C
pass
最初,我尝试在LocA时从rpi.client导入客户机,但失败了,因为它尝试导入马达,然后从rpi导入GPIO,而rpi不存在。我还在LocB上尝试了mock.patch(“rpi.client.Motor”)
(包括在self
之后添加mock\u Motor
,并在LocC上导入了client
,但也失败了。我也尝试了在LocA上模拟rpi
,但也不起作用
如何模拟未安装在系统上的库?您可以使用它来修补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'>
我已经验证了这是一个正确的解决方案。为了更好地回答这个问题,我将在sys.modules.com上展开。正如您可以在
patch.dict()
default behavior中看到的那样,保留原始的字典并只注入新的值。无论如何,我将我的答案与一些其他注释结合起来,以使它更清晰。
import unittest
from unittest import mock
# Location A
class TestClient(unittest.TestCase):
# Location B
setUp(self):
# Location C
pass
>>> 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'>
>>> 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'>