2012-04-25 36 views
18

假設這是代碼嘲笑 - 如何在呼叫者上引發異常?

def move(*args, **kwargs): 
    try: 
     shutil.move(source, destination) 
    except Exception as e: 
     raise e 

,並在我的tests.py

@patch.object(shutil, 'move') 
def test_move_catch_exception(self, mock_rmtree): 
    ''' Tests moving a target hits exception. ''' 
    mock_rmtree.side_effect = Exception('abc') 
    self.assertRaises(Exception, move, 
          self.src_f, self.src_f, **self.kwargs) 

它說,這

File "unittests.py", line 84, in test_move_catch_exception 
    self.src_f, self.src_f, **self.kwargs) 
AssertionError: Exception not raised 

如果我斷言上mock_rmtree它會通過。我怎麼能在呼叫者斷言(在這種情況下,功能move)?


由於aquavitae指出,最主要的原因是複製粘貼錯誤,還有,我也主張在開始的元組。總是使用正確的返回類型...

回答

26

您的示例中存在拼寫錯誤,缺少'

它並不完全清楚你在問什麼,但是如果我正確地理解了你,你在問如何測試在move內部被捕獲的異常。一個問題是,您正在修補shutil.rmtree而不是shutil.move,但您無法確定shutil.rmtree會被調用。 shutil.move只有在成功複製目錄時才實際調用shutil.rmtree,但由於您要將self.src_f複製到自身,因此不會發生這種情況。雖然這不是一個很好的修補方法,因爲shutil.move根本不會調用shutil.rmtree這一假設並且與實現相關。

至於如何測試,只需檢查返回值是按預期:

@patch.object(shutil, 'move') 
def test_move_catch_exception(self, mock_move): 
    ''' Tests moving a target hits exception. ''' 
    e = OSError('abc') 
    mock_move.side_effect = e 
    returns = move(self.src_f, self.src_f, **self.kwargs) 
    assert returns == (False, e) 
+2

謝謝你這麼多。我爲混亂道歉。這是一個複製粘貼錯誤,我沒有抓到。是的,我正在補丁而不是rmtree。我相應地編輯了這篇文章。你對我的粗心在這裏是正確的。非常感謝。 – CppLearner 2012-04-25 06:44:10