代码之家  ›  专栏  ›  技术社区  ›  Remotec

如何在python中模拟RPi.GPIO

  •  1
  • Remotec  · 技术社区  · 7 年前

    RPi.GPIO 在python代码中做一些单元测试。

    我的问题是 RPi.GPIO

    例如

    import iohandler
    ...
    ...
    

    iohandler.py文件

    import RPi.GPIO
    
    def function_to_test():
        pass
    

    这里的问题是,要运行测试,必须导入 iohandler 反过来又必须进口 . 失败的原因是

    我在这个网站上看了下面的另一个答案后,试图欺骗这些模块:

    测试.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 库导致此操作不起作用。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Remotec    7 年前

    通过使用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(....)