如何将异常参数传递给python unittest mock副作用?

如何将需要参数的异常作为模拟side_effects传递?

我正在尝试测试boto.exception.EC2ResponsError的assertRaises,但在_mock_call中获取“TypeError:init()至少需要3个参数(1给定)”.

@mock_ec2
@patch.object(Ec2Region, 'connect')
def test_ec2_get_raises(self, mock_connect):
    conn = boto.connect_ec2()
    mock_connect.return_value = conn
    reservation = conn.run_instances('ami-1234abcd')
    instance = reservation.instances[0]
    Ec2Instance.objects.create(region=self.region, account=self.account,
                               instance_id=instance.id)
    mock_connect.side_effect = boto.exception.EC2ResponseError
    self.assertRaises(
        boto.exception.EC2ResponseError,
        Ec2Instance.ec2_get, self.account, self.region)

我得到的错误是这样的:

======================================================================
ERROR: test_ec2_get_raises (session_ec2.tests.test_instance.Ec2InstanceTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/bschott/.virtualenvs/session-ec2/lib/python2.7/site-packages/moto/core/models.py", line 70, in wrapper
    result = func(*args, **kwargs)
  File "/Users/bschott/.virtualenvs/session-ec2/lib/python2.7/site-packages/mock.py", line 1201, in patched
    return func(*args, **keywargs)
  File "/Users/bschott/Source/session-ec2/session_ec2/tests/test_instance.py", line 84, in test_ec2_get_raises
    Ec2Instance.ec2_get, self.account, self.region)
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 475, in assertRaises
    callableObj(*args, **kwargs)
  File "/Users/bschott/Source/session-ec2/session_ec2/models/instance.py", line 110, in ec2_get
    connection = region.connect(account)
  File "/Users/bschott/.virtualenvs/session-ec2/lib/python2.7/site-packages/mock.py", line 955, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/Users/bschott/.virtualenvs/session-ec2/lib/python2.7/site-packages/mock.py", line 1010, in _mock_call
    raise effect
TypeError: __init__() takes at least 3 arguments (1 given)

最佳答案 如
Calling部分所述,您可以在side_effect初始化中使用实例或类.此外,您可以使用可调用来提升您所需的异常.

当class用于定义side_effect并且所需的异常没有简单的空构造函数时,您将得到一个类似于您的异常,因为mock框架不知道如何构建该异常.

在你的情况下,你可以使用类似的东西

mock_connect.side_effect = boto.exception.EC2ResponseError(400, "My reason", "my body")
点赞