2017-07-05 55 views
0

我是一般使用模擬庫和單元測試的新手。我想我明白模擬庫的工作原理,但我認爲我的方法有問題。使用MagicMock測試方法的內部組件

可以說我有一類Foo具有方法addFoo(bar1, bar2)addFoo調用foo內的其他「私人」的方法,同時也可以提高在各部位的異常代碼...即

class Foo: 
    def __init__(self): 
     # This creates lots of dependencies 

    def _inner1(self, bar): 
     if this_doesnt_work: 
      return None 
     return modified_bar1 

    def _inner2(self, bar2): 
     if this_doesnt_work: 
      return None 
     return modified_bar2 

    def addFoo(bar1, bar2): 
     if self._inner1(bar1) and self._inner2(bar2): 
      #do something 
     else: 
      raise SomeException 

當我單元測試,我目前所做的是在我的單元測試設置中剔除Foo.__init__,並將return_value設置爲無。這可以運行,並允許我在沒有所有外部依賴的情況下對類中的方法運行測試,並使用我的模擬Foo.__init__實例模擬任何類屬性。

之後,如果我想進行單元測試addFoo我會做以下(跳過一堆的步驟)完成:

@patch.object(Foo, '_inner2') 
@patch.object(Foo, '_inner1') 
def test_inner1_exception(self, mock_inner1, mock_inner2): 
    mock_inner1.side_effect = Exception 
    # then do some asserts to make sure it worked 

問題 如何測試一個例外addFoo如果代碼看起來是這樣的:

def addFoo(bar1, bar2): 
    bars = self._getBars() #something that returns a list 
    my_modified_bar_list = [] 
    for bar in bars: 
     my_modified_bar_list.append(self._inner1(bar)) 

    if len(my_modified_bar_list) == 0: 
     raise SomeException 

在這種情況下如何測試SomeException當它是依賴於通過我的方法中的一些陣列產生的值?

回答

0

如果你正在使用的pytest可以assert about expected exceptions如下:

@patch('Foo._getBars', return_value=[]) 
def test_addFoo_exception(self): 
    foo = Foo() 
    with pytest.raises(SomeException): 
     foo.addFoo(Mock(), Mock()) 

由於片段上方顯示,由嘲笑_getBars你是在什麼是返回的控制權,因此可以強制觸發條件在你的代碼中的異常,在這種情況下是一個空列表。

我寫了一個簡短的post with common unit testing pitfalls in Python,你可能會覺得有用。

相關問題