未安装的python模拟和库

问题描述 投票:11回答:1

我正在研究用于机器人的软件,该软件通常在Raspberry Pi上运行。让我们考虑两个文件的导入:

[motor.py(运行电动机):

from RPi import GPIO as gpio

client.py(与服务器通信并将命令中继到电动机):

from rpi.motor import Motor

两个文件都位于名为rpi的目录中,该目录包含__init__.py__main__.pyRPi软件包不能安装在非Rpi设备上。但是,我仍然想测试client.py的功能。

import unittest
from unittest import mock
# Location A


class TestClient(unittest.TestCase):
    # Location B
    setUp(self):
         # Location C
         pass

最初,我在LocA上尝试了from rpi.client import Client,但是失败了,因为它尝试导入Motor,然后从RPi(不存在)导入GPIO。我还在LocB上尝试了mock.patch("rpi.client.Motor")(包括在mock_motor之后添加self,并在LocC上导入了Client,但是也失败了。我也尝试在LocA上模拟RPi,但是它没有用)也可以。

您如何模拟系统中未安装的库?

python unit-testing python-3.x mocking python-unittest
1个回答
8
投票

您可以使用patch.dict()修补patch.dict()和模拟sys.modules模块,如指向的文档中所示。

使用测试模块顶部的跟踪代码:

RPi

在Python3中,您具有相同的行为。


在您的特定情况下,使用>>> 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'> 有点过大;也许您对补丁程序上下文和原始状态恢复不感兴趣。因此,您可以通过直接设置patch.dict来简化它:

sys.modules["RPi"]

0
投票

我陷入了与上例类似的问题,但导入语句为

>>> 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'>

© www.soinside.com 2019 - 2024. All rights reserved.