我想使用以下脚本模拟在MyClass.mymethod中调用的MyClass.toBeMockedMethod。它运行时没有实际嘲笑它。不知道为什么......
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 :(得分:0)
与this question一样,您真正要做的是patch MyClass
的实例。如果MyClass
是new-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)
请注意,调用mocker的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
这是期望的结果。