2014-02-13 16 views
6

我需要測試一個調用open的實例方法。在第一個測試案例中,我設置了mock.mock_open以按預期返回一個字符串。這很奇妙。如何讓mock.mock_open引發IOError?

但是,我還需要測試從這個函數中拋出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') 

回答

8

分配例外mock.mock_open.side_effect

mock.mock_open.side_effect = IOError 

mock.Mock.side_effect documentation

這可以是一個函數的調用當模擬被調用時,或者一個異常(類或實例)被引發。

演示:

>>> 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() 
+0

這是怎麼應該是從使用'TestCase'函數內?我編輯了我的答案,以顯示我的最新嘗試 - 也許你可以發現我的錯誤! – blz

+1

@blz:'patch()'上下文管理器返回一個模擬。我會更新。 –

+0

非常感謝!我是個新手,但實際上很簡單,只要有人告訴你它是如何完成的=) – blz