2016-11-14 78 views
0

基本上我想這樣做替代類:如何嘲笑/一個列表

class SeaLion(object): 
    def __iter__(self): 
     return self 
    def next(self): 
     ... 

def train(): 
    sea_lion = SeaLion(...) 
    for tooth in sea_lion: 
     .. do something 

然後在我的測試文件我有:

class TestTrain(TestCase): 
    @patch('module.SeaLion') 
    def test_train(self, mock_SeaLion): 
     mock_SeaLion.return_value = [1,2,3] 
     ... 

基本上我想sea_lion在訓練函數是一個列表而不是該類的一個實例。

與上面的代碼sea_lion是MagicMock(名稱= '海獅()')

+0

'mock_SeaLion = MagicMock()' - 你需要閱讀[Python中的分配方式](http://nedbatchelder.com/text/names.html),因爲爲你的'mock_SeaLion'局部變量分配一個新的值顯然是錯誤的。 – user2357112

+0

好點。我拿出了那條線。儘管如此,同樣的問題。 – Greg

+0

您的解決方案應該可以工作。你能不能澄清你的問題? – zanseb

回答

2

嘗試這種情況:

import unittest 
from mock import patch 

class SeaLion(object): 
    def __iter__(self): 
     return self 

    def next(self): 
     pass 

def train(): 
    sea_lion = SeaLion() 
    print(repr(sea_lion)) 
    for tooth in sea_lion: 
     return True 

    return False 

class TestTrain(unittest.TestCase): 
    @patch('__main__.SeaLion') 
    def test_train(self, mock_SeaLion): 
     mock_SeaLion.return_value = [1] 
     self.assertTrue(train()) 

if __name__ == '__main__': 
    unittest.main() 

結果:

[1] 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.044s 

OK 
+0

謝謝。這似乎是我正在做的同樣的事情。我想我的代碼在某處肯定有問題。 – Greg

+0

唯一的區別是:@patch('__ main __。SeaLion')。 – zanseb