我试图RPi.GPIO在 python 代码中模拟来做一些单元测试。
我RPi.GPIO遇到的问题是,当在我的单元测试中调用时,我的导入失败了,而这些测试并没有在实际的 Raspberry Pi 上运行。
例如
测试.py
import iohandler
...
...
Run Code Online (Sandbox Code Playgroud)
iohandler.py
import RPi.GPIO
def function_to_test():
pass
Run Code Online (Sandbox Code Playgroud)
这里的问题是,要运行测试,它必须 import iohandler,而后者必须 import RPi.GPIO。这将失败,因为RPi.GPIO未安装在将运行测试的机器上。
在查看本网站上的另一个答案后,我试图尝试欺骗模块,如下所示:
测试.py
import sys
import gpiomock # this is a file on the file system
sys.modules["RPi.GPIO"] = gpiomock.GPIO()
import iohandler # the .py file that contains the actual GPIO import
Run Code Online (Sandbox Code Playgroud)
gpiomock.py
class GPIO():
...
...
Run Code Online (Sandbox Code Playgroud)
由于sys.modules只是一本字典,我认为这会起作用,因为我提供了一个用于查找的键RPi.GPIO以及我想用什么替换它。但是我收到以下错误消息。
ImportError: No module named RPi.GPIO
感觉就像实际库的嵌套结构RPi.GPIO导致这不起作用。
关于如何使这项工作有任何建议?
设法通过使用 Reddit 中的示例来实现此功能,我将在下面重现该示例:
https://www.reddit.com/r/Python/comments/5eddp5/mock_testing_rpigpio/#ampf=undefined
测试.py
from mock import MagicMock, patch
MockRPi = MagicMock()
modules = {
"RPi": MockRPi,
"RPi.GPIO": MockRPi.GPIO,
}
patcher = patch.dict("sys.modules", modules)
patcher.start()
# Then for the actual test
with patch("RPi.GPIO.output") as mock_gpio:
# Invoke the code to test GPIO
mock_gpio.assert_called_with(....)
Run Code Online (Sandbox Code Playgroud)
尝试Mock.GPIO库
安装后,可以按如下方式使用
try:
import RPi.GPIO as GPIO
except:
import Mock.GPIO as GPIO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |