2016-11-14 39 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