我正在尝试在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
库的嵌套结构导致此方法无效。
关于如何进行这项工作的任何建议?
答案 0 :(得分:1)
答案 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(....)