如何将异常参数传递给python unittest模拟副作用? [英] How do you pass exception arguments to python unittest mock side effect?

查看:88
本文介绍了如何将异常参数传递给python unittest模拟副作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do you pass exceptions that require arguments as mock side_effects?

我正在尝试测试boto.exception.EC2ResponsError的assertRaises,但是在_mock_call中得到"TypeError: init ()至少包含3个参数(给定1个)".

I'm trying to test for assertRaises of boto.exception.EC2ResponsError, but get a "TypeError: init() takes at least 3 arguments (1 given)" in _mock_call.

@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)

推荐答案

As documented in Calling section you can use both instance or class in side_effect initialization. Moreover you can use a callable that raise your desired exception.

当使用类定义side_effect时,所需的异常没有琐碎的空构造函数,您将得到与您所拥有的异常类似的异常,因为mock框架不知道如何构建该异常.

When class is used to define side_effect and the desired exception has not the trivial empty constructor you will get an exception like the one you had because mock framework doesn't know how to build that exception.

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

In your case you can use something like

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

这篇关于如何将异常参数传递给python unittest模拟副作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆