2011-12-01 50 views
0

我想模拟MyClass.toBeMockedMethod,它在MyClass.mymethod中使用以下脚本调用。它运行时没有真正嘲笑它。不知道为什么....为什么这个模拟脚本不起作用(unittest,Mocker,python)

class Test_mytest(MockerTestCase): 

    def mock_it_up(self, function, result=None, mmin=0, mmax=None): 
     function = self.m.mock() 
     function(ARGS) 
     self.m.result(result) 
     self.m.count(mmin, mmax) 

    def setUp(self): 
     self.m = Mocker() 

     self.mock_it_up(MyClass.toBeMockedMethod) 

     self.o=Myclass(0) 


    def test_one_atom(self): 
     self.o.mymethod() 


    def tearDown(self): 
     pass 

if __name__ == '__main__': 
    main() 

回答

0

this question你真正想做的是patch您的MyClass实例。如果MyClassnew-style class,那么你可以这样做:

class Test_mytest(MockerTestCase): 

    def mock_it_up(self, function, result = None, mmin = 0, mmax = None): 
     methodToMock = getattr(self.p, function) 
     methodToMock() 
     self.m.result(result) 
     self.m.count(mmin, mmax) 

    def setUp(self): 
     self.m = Mocker() 
     self.o = MyClass(0) 
     self.p = self.m.patch(self.o) 
     self.mock_it_up('toBeMockedMethod') 
     # Put more calls to mock_it_up here. 
     self.m.replay() 

    def test_one_atom(self): 
     self.o.mymethod() 

这将修改self.o因此调用toBeMockedMethod被嘲笑。

但是,如果MyClass不是新风格类,则修补程序将不起作用。在这种情况下,您可以使用type simulation来欺骗MyClass做你想做的事。例如:

class Test_mytest(MockerTestCase): 

    def mock_it_up(self, function, result = None, mmin = 0, mmax = None): 
     methodToMock = getattr(self.mockObj, function) 
     methodToMock() 
     self.m.result(result) 
     self.m.count(mmin, mmax) 

    def setUp(self): 
     self.m = Mocker() 
     self.o = MyClass(0) 
     self.mockObj = self.m.mock(MyClass) 
     self.mock_it_up('toBeMockedMethod') 
     # Put more calls to mock_it_up here. 
     self.m.replay() 

    def test_one_atom(self): 
     MyClass.mymethod(self.mockObj) 

注意,模仿者的mock方法被调用的类是类型模拟。之后,我们不打电话self.o.mymethod(),而是拨打MyClass.mymethod(...)。现在MyClass.mymethod()需要一个MyClass的实例作为它的第一个参数,但幸运的是这个模拟对象伪装成MyClass的一个实例,所以这个调用通过。当mymethod()调用toBeMockedMethod()它实际上会调用模拟方法,而不是真正的方法。

我迅速入侵了一个测试MyClass这样的:

class MyClass(): 
    def __init__(self, x): 
     self.x = x 

    def toBeMockedMethod(self): 
     print "Not Mocked!" 

    def mymethod(self): 
     self.toBeMockedMethod() 

和当我跑将该代码作为一个单元测试我得到:

. 
---------------------------------------------------------------------- 
Ran 1 test in 0.002s 

OK 

这是期望的结果。

+0

我正在尝试你的示例,当我调用m.replay()时,“无法设置内置/扩展类型实例的属性”() – ApriOri

+0

@ApriOri当我测试它时代码为我工作回到2011年12月。您可能想问一个关于StackOverflow的问题,列出您的代码并寻求帮助。 – srgerg