首页 > 解决方案 > 将 MagicMock 对象转换为我可以在测试中使用的对象

问题描述

我不熟悉 Python 测试,尤其是使用模拟,所以这可能是完全错误的。

我的测试中有这段代码:

import os
import mock
from mock import Mock
from tests import unittest
from datetime import datetime
from ibm_botocore.session import Session
import logging

class TestS3Parameters(unittest.TestCase):

    def setUp(self):
        super(TestS3Parameters, self).setUp()

        # Set the config file to something that doesn't exist so
        # that we don't accidentally load a config.
        os.environ['AWS_CONFIG_FILE'] = '~/.aws/config-missing'

    def create_session(self, *args, **kwargs):
        """
        Create a new session with the given arguments. Additionally,
        this method will set the credentials file to the test credentials
        used by the following test cases.
        """
        kwargs['session_vars'] = {
            'credentials_file': (
                None, None,
                os.path.join(os.path.dirname(__file__), 'test-credentials'),
                None)
        }

        return Session(*args, **kwargs)

    @mock.patch('ibm_botocore.credentials.Credentials')
    def test_extended_endpoint(self, my_mock):
        now = datetime.utcnow().strftime("%Y%m%d")
        extended_listing_mock_response_basic = {
            "IsTruncated": False,
            "Buckets": [
                {
                    "Name": "bucketnamefoo",
                    "CreationDate": str(now),
                    "LocationConstraint": "bar-standard"
                }
            ],
            "Owner": {
                "DisplayName": "ownerfoo",
                "ID": "idfoo"
            }
        }
        s = self.create_session()
        client = s.create_client('s3', region_name='us-east-1', aws_access_key_id='foo',
            aws_secret_access_key='bar')
        # Create a mock response.
        self.mock_response = Mock()
        self.mock_response = extended_listing_mock_response_basic
        request = my_mock.list_bucket()
        self.assertEquals(request['httpRequest']['method'], 'GET')
        self.assertEquals(request['httpRequest']['path'], '/?extended')


if __name__ == "__main__":
    unittest.main()

当我运行它时,我收到此错误:

Traceback (most recent call last):
  File "/core/.tox/py33/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/core/tests/unit/test_s3_param.py", line 56, in test_extended_endpoint
    request = client.list_bucket()
  File "/core/ibm_botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/core/ibm_botocore/client.py", line 648, in _make_api_call
    operation_model, request_dict, request_context)
  File "/core/ibm_botocore/client.py", line 667, in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
  File "/core/ibm_botocore/endpoint.py", line 102, in make_request
    return self._send_request(request_dict, operation_model)
  File "/core/ibm_botocore/endpoint.py", line 132, in _send_request
    request = self.create_request(request_dict, operation_model)
  File "/core/ibm_botocore/endpoint.py", line 116, in create_request
operation_name=operation_model.name)
  File "/core/ibm_botocore/hooks.py", line 356, in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
  File "/core/ibm_botocore/hooks.py", line 228, in emit
    return self._emit(event_name, kwargs)
  File "/core/ibm_botocore/hooks.py", line 211, in _emit
    response = handler(**kwargs)
  File "/core/ibm_botocore/signers.py", line 90, in handler
    return self.sign(operation_name, request)
  File "/core/ibm_botocore/signers.py", line 157, in sign
    auth.add_auth(request)
  File "/core/ibm_botocore/auth.py", line 425, in add_auth
    super(S3SigV4Auth, self).add_auth(request)
  File "/core/ibm_botocore/auth.py", line 368, in add_auth
    signature = self.signature(string_to_sign, request)
  File "/core/ibm_botocore/auth.py", line 349, in signature
    request.context['timestamp'][0:8])
  File "/core/ibm_botocore/auth.py", line 169, in _sign
    sig = hmac.new(key, msg.encode('utf-8'), sha256).digest()
 File "/Users/me/.pyenv/versions/2.7.8/lib/python2.7/hmac.py", line 136, in new
    return HMAC(key, msg, digestmod)
  File "/Users/me/.pyenv/versions/2.7.8/lib/python2.7/hmac.py", line 75, in __init__
    self.outer.update(key.translate(trans_5C))
TypeError: must be convertible to a buffer, not MagicMock

如何将其转换为我可以使用的类型?

我尝试使用request = my_mock.list_bucket(),但它给了我这个错误:

AssertionError: <MagicMock name='Credentials.list_buckets_extended().__getitem__().__getitem__()' id='4459954832'> != 'GET'

我想要做的是创建一个模拟客户端,我可以将其用于我的list_bucket通话。然后我希望检查它以确保请求是 aGET并且/?extended使用了端点。

标签: pythonunit-testingtestingtypeerror

解决方案


推荐阅读