与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)
注意,模仿者的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
这是期望的结果。
我正在尝试你的示例,当我调用m.replay()时,“无法设置内置/扩展类型实例的属性”() – ApriOri
@ApriOri当我测试它时代码为我工作回到2011年12月。您可能想问一个关于StackOverflow的问题,列出您的代码并寻求帮助。 – srgerg