Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未安装的python模拟库和库_Python_Unit Testing_Python 3.x_Mocking_Python Unittest - Fatal编程技术网

未安装的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'>