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

时间:2011-12-01 20:05:44

标签: python

我想使用以下脚本模拟在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()

1 个答案:

答案 0 :(得分: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)

请注意,调用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

这是期望的结果。