Python单元测试用例预期与实际不匹配

osh3o9ms  于 2022-12-24  发布在  Python
关注(0)|答案(1)|浏览(226)

我正在尝试模拟secrets manager client,之前变量不在类中,所以我可以直接使用如下补丁模拟客户端:

@patch('my_repo.rc.client')

现在,由于我使用的是示例方法,我需要模拟示例方法。

rc.py

import boto3
import json
from services.provisioner_logger import get_provisioner_logger
from services.exceptions import UnableToRetrieveDetails

class MyRepo(object):
    def __init__(self, region):
        self.client = self.__get_client(region)

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

    def __get_client(self, region):
        return boto3.session.Session().client(
            service_name='secretsmanager',
            region_name=region
        )

测试_安全性.py

from unittest import TestCase
from unittest.mock import patch, MagicMock
from my_repo.rc import MyRepo
import my_repo

class TestSecretManagerMethod(TestCase):
    def test_get_secret_value(self):
        with patch.object(my_repo.rc.MyRepo, "id_lookup") as fake_bar_mock:
            fake_bar_mock.get_secret_value.return_value = {
                "SecretString": '{"secret": "gotsomecreds"}',
            }
            actual = MyRepo("eu-west-1").id_lookup("any-name")

            self.assertEqual(actual, {"secret": "gotsomecreds"})

现在,我尝试用SO post来实现相同的功能,但最终结果并不匹配。

self.assertEqual(actual, {"secret": "gotsomecreds"})
AssertionError: <MagicMock name='id_lookup()' id='4589498032'> != {'secret': 'gotsomecreds'}

我想我已经接近了,但无法找出我到底错过了什么。

khbbv19g

khbbv19g1#

好吧,我们要一个模拟,我们不需要魔术模拟。事实上,我们要三个。
第一,会议

mock_session_object = Mock()

然后客户,

mock_client = Mock()

这个模拟客户端将返回您的响应:

mock_client.get_secret_value.return_value = {
            "SecretString": '{"secret": "gotsomecreds"}',
        }

会话客户端将返回以下内容:

mock_session_object.client.return_value = mock_client

好吧。确实很多,但我们有客户在里面。把这些加在一起,我们有

from unittest import TestCase
from unittest.mock import patch, Mock
from credentials_repo.retrieve_credentials import CredentialsRepository
import credentials_repo

class TestSecretManagerMethod(TestCase):
    @patch("boto3.session.Session")
    def test_get_secret_value(self, mock_session_class):
        mock_session_object = Mock()
        mock_client = Mock()
        mock_client.get_secret_value.return_value = {
                "SecretString": '{"secret": "gotsomecreds"}',
            }
        mock_session_object.client.return_value = mock_client
        mock_session_class.return_value = mock_session_object
        actual = CredentialsRepository("eu-west-1").find_by_id("db-creds")

        self.assertEqual(actual, {"secret": "gotsomecreds"})

(The顶部的@path与内部的with相同,对吗?)

相关问题