Python unittest python单元测试:已达到模拟递归限制

Python unittest python单元测试:已达到模拟递归限制,python-unittest,Python Unittest,模拟第三方api调用并修补它们以测试api调用 @mock.patch('payments.tests.stripe_mock.StripeWrapper.add_card') @mock.patch('payments.tests.stripe_mock.StripeWrapper.get_customer') def test_card_1(self, _mock_customer, _mock_card): post_data = {"number": 1233} resp

模拟第三方api调用并修补它们以测试api调用

@mock.patch('payments.tests.stripe_mock.StripeWrapper.add_card')
@mock.patch('payments.tests.stripe_mock.StripeWrapper.get_customer')
def test_card_1(self, _mock_customer, _mock_card):
    post_data = {"number": 1233}
    response = self.client.post(reverse("card-list"), data=post_data)
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)
api调用工作正常,但在api调用发送响应时,它抛出以下错误

File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 1298, in patched
    return func(*args, **keywargs)
  File "/home/naveen/WIP/automaticfleet/payments/tests/test_views.py", line 535, in test_create_card_4
    response = self.client.post(reverse("card-list"), data=post_data)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/test.py", line 168, in post
    path, data=data, format=format, content_type=content_type, **extra)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/test.py", line 90, in post
    return self.generic('POST', path, data, content_type, **extra)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/compat.py", line 189, in generic
    return self.request(**r)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/test.py", line 157, in request
    return super(APIClient, self).request(**kwargs)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/test.py", line 109, in request
    request = super(APIRequestFactory, self).request(**kwargs)
  File "/home/aws/local/lib/python2.7/site-packages/django/test/client.py", line 440, in request
    six.reraise(*exc_info)
  File "/home/aws/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response
    response = response.render()
  File "/home/naveen/ENV/automaticfleet/local/lib/python2.7/site-packages/django/template/response.py", line 103, in render
    self.content = self.rendered_content
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/response.py", line 59, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "/home/aws/local/lib/python2.7/site-packages/rest_framework/renderers.py", line 98, in render
    separators=separators
  File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/naveen/ENV/automaticfleet/local/lib/python2.7/site-packages/rest_framework/utils/encoders.py", line 51, in default
    return obj.tolist()
  File "/home/naveen/ENV/automaticfleet/local/lib/python2.7/site-packages/mock/mock.py", line 1055, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/home/naveen/ENV/automaticfleet/local/lib/python2.7/site-packages/mock/mock.py", line 1127, in _mock_call
    ret_val = self.return_value
 File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 1055, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/home/naveen/ENV/automaticfleet/local/lib/python2.7/site-packages/mock/mock.py", line 1127, in _mock_call
    ret_val = self.return_value
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 611, in __get_return_value
    _new_parent=self, _new_name='()'
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 1011, in _get_child_mock
    return klass(**kw)
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 1953, in __init__
    _safe_super(MagicMixin, self).__init__(*args, **kw)
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 1043, in __init__
    self.side_effect = side_effect
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 814, in __setattr__
    return object.__setattr__(self, name, value)
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 656, in __set_side_effect
    self._mock_side_effect = value
  File "/home/aws/local/lib/python2.7/site-packages/mock/mock.py", line 814, in __setattr__
    return object.__setattr__(self, name, value)
RuntimeError: maximum recursion depth exceeded while calling a Python object

这个堆栈跟踪完成了吗?谁称之为模拟?@Micheled'Amico post更新了完整的stacktrace。我现在没有时间深入研究这个问题,但是像
add\u card
get\u customer
返回对象这样的接缝是由框架装饰的。尝试创建此对象的伪对象,并使用
return\u value
返回伪对象,而不是
MagicMock
正确,我已经解决了如何设置模拟对象返回数据的问题。