繁体   English   中英

Python修补类-方法return_value返回MagicMock

[英]Python patched Class - method return_value returns MagicMock

我有一个函数可以确定是否可以从环境变量或 Google Cloud Secret Manager(通过自定义类)中提取令牌。

我正在模拟秘密管理器连接类,因此它实际上并没有连接到 GCP,但是我从中获得的pull_secret()方法正在返回另一个 MagicMock 对象。

这是函数代码( utility_functions.py ):

def fetch_token(secret_name: str):
try:
    token = os.environ['TOKEN']
except KeyError:
    print("TOKEN environment variable not set. Pulling Secret from Google Cloud Secret Manager...")
    token = None

if token is None or token == '':
    gcp_sm = SecretManagerConnection()
    token = gcp_sm.pull_secret(project_id=os.environ['GCP_PROJECT_ID'], secret_name=secret_name)

return token

我正在使用的测试代码如下:

@patch("app.utilities.utility_functions.SecretManagerConnection")
def test_fetch_token_google_secret(mock_sm):
    os.environ["GCP_PROJECT_ID"] = "test"

    mock_sm.pull_secret().return_value = "1234567890.abcdefghijklmnopqrstuvwxyz"

    del os.environ["TOKEN"]

    assert fetch_token("test") == "1234567890.abcdefghijklmnopqrstuvwxyz"

我得到的错误是AssertionError: assert <MagicMock name='SecretManagerConnection().pull_secret()' id='2533589158400'> == '1234567890.abcdefghijklmnopqrstuvwxyz'

在尝试分配pull_secret()返回值时我做错了什么吗?

问题的原因

修补SecretManagerConnection类将用一个魔术模拟实例替换它。 当在fetch_token函数中实例化此类时,实例化的类将返回模拟实例的return_value ,在您的情况下,该实例未正确配置/设置。

如何解决这个问题?

在模拟类的return_value上配置/设置pull_secret方法的return_value ,而不是在模拟类本身上设置。

@patch("app.utilities.utility_functions.SecretManagerConnection")
def test_fetch_token_google_secret(mock_sm):
    os.environ["GCP_PROJECT_ID"] = "test"

    instance = mock_sm.return_value
    instance.pull_secret.return_value = "1234567890.abcdefghijklmnopqrstuvwxyz"

    del os.environ["TOKEN"]
    assert fetch_token("test") == "1234567890.abcdefghijklmnopqrstuvwxyz"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM