python - 如何让 mock.mock_open 引发 IOError?

标签 python unit-testing mocking

我需要测试调用open 的实例方法。在第一个测试用例中,我将 mock.mock_open 设置为按预期返回一个字符串。这非常有效。

但是,我还需要测试从该函数中抛出 IOError 的情况。如何让 mock.mock_open 引发任意异常?

到目前为止,这是我的方法:

@mock.patch.object(somemodule, 'generateDefaultKey')
def test_load_privatekey(self, genkey)
    mo = mock.mock_open(read_data=self.key)
    mo.side_effect = IOError
    with mock.patch('__main__.open', mo, create=True):
        self.controller.loadPrivkey()

    self.assertTrue(genkey.called, 'Key failed to regenerate')

最佳答案

将异常分配给mock.mock_open.side_effect:

mock.mock_open.side_effect = IOError

来自mock.Mock.side_effect documentation :

This can either be a function to be called when the mock is called, or an exception (class or instance) to be raised.

演示:

>>> mock = MagicMock()
>>> mock.mock_open.side_effect = IOError()
>>> mock.mock_open()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/mock.py", line 955, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/mock.py", line 1010, in _mock_call
    raise effect
IOError

当使用patch() 作为上下文管理器时,会生成一个新的模拟对象;分配给那个模拟对象:

with mock.patch('__main__.open', mo, create=True) as mocked_open:
    mocked_open.side_effect = IOError()
    self.controller.loadPrivkey()

关于python - 如何让 mock.mock_open 引发 IOError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21760803/

相关文章:

Python - 绘制多边形

c# - NUnit Assert - 显示完整的错误信息

ruby - RSpec allow/expect 与 just expect/and_return

java - 使用 Mockito 模拟静态方法

java - 模拟一个返回 Stream 并被多次调用的方法

python - Matplotlib注释更改字体

python - 如何在整个目录中查找具有特定扩展名的文件,然后复制到另一台服务器

python - Odoo常规设置中的添加

unit-testing - ?assertException 实际上适用于 gen_fsm :startlink?

javascript - 在 QUnit 中断言异常