如何在 python 中模拟 RPi.GPIO

Rem*_*tec 5 python python-2.7

我试图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导致这不起作用。

关于如何使这项工作有任何建议?

Rem*_*tec 5

设法通过使用 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)


cod*_*nio 5

尝试Mock.GPIO

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

try:
    import RPi.GPIO as GPIO
except:
    import Mock.GPIO as GPIO
Run Code Online (Sandbox Code Playgroud)