如何在python中模拟RPi.GPIO

时间:2018-08-16 14:14:37

标签: python python-2.7

我正在尝试在python代码中模拟RPi.GPIO进行一些单元测试。

我遇到的问题是,在没有在实际Raspberry Pi上运行的单元测试中调用RPi.GPIO时导入失败。

例如

tests.py

import iohandler
...
...

iohandler.py

import RPi.GPIO

def function_to_test():
    pass

这里的问题是,要运行测试,它必须导入iohandler,而后者又必须导入RPi.GPIO。由于RPi.GPIO未安装在将运行测试的计算机上,因此失败。

在查看此站点上的另一个答案之后,我试图尝试欺骗这些模块:

tests.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库的嵌套结构导致此方法无效。

关于如何进行这项工作的任何建议?

2 个答案:

答案 0 :(得分:1)

试试 Mock.GPIO

安装后,您可以如下使用

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

答案 1 :(得分:0)

设法通过使用Reddit的示例使此工作正常进行,我将在下面进行复制:

https://www.reddit.com/r/Python/comments/5eddp5/mock_testing_rpigpio/#ampf=undefined

tests.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(....)