为什么这个模拟脚本不起作用(unittest、Mocker、python)

为什么这个模拟脚本不起作用(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

我想模拟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.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的问题,列出您的代码并寻求帮助。