为什么这个模拟脚本不起作用(unittest、Mocker、python)
我想模拟MyClass.toBeMockedMethod,它是使用以下脚本在MyClass.mymethod中调用的。它运行时并没有真正嘲笑它。不知道为什么为什么这个模拟脚本不起作用(unittest、Mocker、python),python,Python,我想模拟MyClass.toBeMockedMethod,它是使用以下脚本在MyClass.mymethod中调用的。它运行时并没有真正嘲笑它。不知道为什么 class Test_mytest(MockerTestCase): def mock_it_up(self, function, result=None, mmin=0, mmax=None): function = self.m.mock() function(ARGS) self.m.re
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()
正如您真正想要做的一样,是MyClass的实例。如果MyClass是a,则可以执行以下操作:
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不是一个新样式的类,那么补丁将不起作用。在这种情况下,您可以使用来诱使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时,它实际上会调用mocked方法,而不是真正的方法
我很快创建了一个测试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时,我无法设置内置/扩展类型“instance”的属性。replay@ApriOri当我在2011年12月测试它时,代码对我起了作用。您可能想问一个关于StackOverflow的问题,列出您的代码并寻求帮助。