我们可以将函数和mocker传递给另一个函数进行模拟吗?

时间:2011-12-01 23:17:55

标签: python

我想将函数表单和mocker一起传递给测试类中的另一个函数,并期望函数在返回后被模拟。但是,它似乎不起作用,并感谢任何建议!

class Cls():
   def submthd(self):
      return 0
   def mthd(self):
      a=self.submthd()
      return a

class Test_me(MockerTestCase):
   def setUp(self):
      pass

   def mockup(self,f,m):
      f = m.mock()
      f(ARGS)
      m.result(1)
      m.replay()

   def test_null(self):
      m=Mocker()
      o=Cls()
      self.mockup(o.submthd,m)
      self.assertEqual(o.mthd(),1)
      m.verify()

1 个答案:

答案 0 :(得分:0)

我可能会弄错,但在我看来,您尝试做的事情在Python Mocker的说法中称为"Patching"。您想要更改现有submthd()实例上Cls()调用的行为。

首先,您需要使用new style classes(例如object的子类)。所以让我们重新定义Cls()

class Cls(object):
    def submthd(self):
        return 0
    def mthd(self):
        return self.submthd()
    def submthd2(self):
        return 0
    def mthd2(self):
        return self.submthd()

我添加了submthd2mthd2,以说明如何在多种方法中使用mockup(...)方法,但您的类基本上没有变化。

现在,为了在测试用例中使用修补程序,您可以执行以下操作:

class Test_me(MockerTestCase):
    def mockup(self, p, f, m):
        methodToCall = getattr(p, f)
        methodToCall()
        m.result(1)

    def test_null(self):
        m = Mocker()
        o = Cls()
        p = m.patch(o)
        self.mockup(p, 'submthd', m)
        self.mockup(p, 'submthd2', m)
        m.replay()
        self.assertEqual(o.mthd(), 1)
        self.assertEqual(o.mthd2(), 1)
        m.verify()

当我将此代码作为单元测试运行时,我得到:

.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK