繁体   English   中英

如何在 python 中模拟 RPi.GPIO

[英]How to mock RPi.GPIO in python

我试图在 python 代码中模拟RPi.GPIO来做一些单元测试。

RPi.GPIO的问题是,当在我的单元测试中调用时,我的RPi.GPIO导入失败,而这些测试并未在实际的 Raspberry Pi 上运行。

例如

测试.py

import iohandler
...
...

iohandler.py

import RPi.GPIO

def function_to_test():
    pass

这里的问题是,要运行测试,它必须导入iohandler ,而后者又必须导入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

gpiomock.py

class GPIO():
    ...
    ...

由于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(....)

试试Mock.GPIO

安装后,您可以按如下方式使用它

try:
    import RPi.GPIO as GPIO
except:
    import Mock.GPIO as GPIO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM