在python中模拟在功能外运行命令的脚本

问题描述

找到了一个脚本,该脚本可以在功能之外导入和运行aws:

$ cat script.py

import boto3

client = boto3.client("ssm")
...

试图像这样嘲笑,但没有成功:

cat test.py
from unittest.mock import patch

@patch("script.boto3")
def test_boto(boto3):
    import script

当我使用pytest运行脚本时,我从AWS收到错误消息。

是否可以像这样模拟脚本?

解决方法

仅发现不可能模拟boto3或像os这样的整个模块,但是可以模拟模块内部的功能。

示例:模拟boto3.client

script.py

import boto3
client = boto3.client("ssm")

test.py

from unittest.mock import patch,MagicMock

@patch("boto3.client")
def test_boto(boto3):
    import script
    assert isinstance(script.client,MagicMock)

嘲笑os.environ

script.py

import os

test.py

from unittest.mock import patch

@patch("os.environ",{"TEST_ENV": "TEST"})
def test_environ():
    import script
    assert script.os.environ["TEST_ENV"] == "TEST"