Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我们可以将一个函数和mocker传递给另一个函数进行mock吗?_Python - Fatal编程技术网

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

Python 我们可以将一个函数和mocker传递给另一个函数进行mock吗?,python,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(sel

我想将函数表单和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()

我可能弄错了,但在我看来,您试图做的是用Python Mocker的说法来命名的。您希望更改现有Cls实例上submthd调用的行为

首先,您需要使用对象的子类。让我们重新定义Cls:

我已经添加了submthd2和mthd2来展示如何使用您的模型。。。方法,但在其他方面,您的类基本上是不变的

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

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

它确实有效,但我不允许更改源代码,所以我是否可以绕过这个问题,而不使其成为object的子类?请参阅我的答案,我将处理您正在测试的类不是object的子类的情况。
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK