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

时间:2015-06-05 23:06:36

标签: python unit-testing mocking boto

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

我正在尝试测试boto.exception.EC2ResponsError的assertRaises,但得到一个“TypeError: init ()在_mock_call中至少需要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)

1 个答案:

答案 0 :(得分:7)

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

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

在您的情况下,您可以使用类似

的内容
mock_connect.side_effect = boto.exception.EC2ResponseError(400, "My reason", "my body")