簡體   English   中英

python 中的單元測試未按預期工作

[英]unittest in python not working as expected

我們正在通過TerraformCI/CD方式部署代碼。 因此,我們有一個lambda function ,我在該函數下編寫了用於檢索特定secret憑證的代碼。

下面是我的 lambda 代碼:

logger = get_provisioner_logger()
session = boto3.session.Session()
client = session.client(
    service_name="secretsmanager",
    region_name=""
)


def lambda_handler(event, context):
    logger.info("lambda invoked with event: " + str(event))
    domain_name = "db-creds"
    secret_data = getCredentials(domain_name)
    acc = secret_data["acc"]
    user = secret_data["user"]
    password = secret_data["pass"]
    #....
    #here we are invoking other methods where we are passing the above creds
    #....
    return handler.handle(event)


def getCredentials(domain_name):
    try:
        response = client.get_secret_value(SecretId=domain_name)
        result = json.loads(response['SecretString'])
        print(result)
        logger.info("Got value for secret %s.", domain_name)
        return result
    except UnableToRetrieveDetails as e:
        logger.error("unable to retrieve secret details due to ", str(e))
        raise e

現在,我已經編寫了一個測試用例,我試圖模擬客戶端並試圖偽造響應的返回值,但我無法這樣做。 下面是我的代碼:

from unittest import TestCase
from unittest.mock import patch
from api.lambda_handler import getCredentials
import json

@patch('api.lambda_handler.client')
class TestSecretManagerMethod(TestCase):

    def test_get_secret_creds(self, sm):
        sm.response.return_value = {"secret":"gotsomecreds"}
        actual = getCredentials("db-creds")
        self.assertEqual(actual, "hey")

它給了我以下錯誤:

 raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not MagicMock. 

我到底錯過了什么?

凱文的回答是正確的。

問題是您混淆了需要修補和返回的內容。

在你的代碼中你說:如果你調用client.response()然后返回{"secret":"gotsomecreds"} 問題是這不是您的代碼中發生的事情。

您實際上是在調用client.get_secret_value(something) ,這就是需要修補的地方:

@patch('api.lambda_handler.client')
class TestSecretManagerMethod(unittest.TestCase):
    def test_get_secret_creds(self, sm):
        sm.get_secret_value.return_value = {
            "SecretString": '{"secret": "gotsomecreds"}',
        }
        actual = getCredentials("db-creds")
        self.assertEqual(actual, {"secret": "gotsomecreds"})

我還冒昧地修正了斷言,因為你設置它的方式"hey"不會被返回。

順便說一句,我強烈建議您查看moto項目。 它提供了大部分 AWS API 的模擬,將為您節省大量工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM