Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
如何在没有Mock的情况下存根Python方法_Python_Unit Testing_Mocking_Stub - Fatal编程技术网

如何在没有Mock的情况下存根Python方法

如何在没有Mock的情况下存根Python方法,python,unit-testing,mocking,stub,Python,Unit Testing,Mocking,Stub,我是一名C#dev开发人员,正在开发一些Python的东西,所以我现在还不知道自己在做什么。我已经读到,您并不真的需要Python的依赖注入。我被告知,您可以在代码中实例化对象,并让它们以您想要的方式运行,但是,您可以将这些对象上的方法指向我自己在测试中定义的存根——假设没有模拟 这是真的吗?我已经试过了,但还是没能成功。这实际上是如何做到的?如何在没有模拟库的情况下在Python中存根方法?下面是一个基本示例。请注意,从未调用生产getData()方法。它已经用一根木桩模拟出来了 import

我是一名C#dev开发人员,正在开发一些Python的东西,所以我现在还不知道自己在做什么。我已经读到,您并不真的需要Python的依赖注入。我被告知,您可以在代码中实例化对象,并让它们以您想要的方式运行,但是,您可以将这些对象上的方法指向我自己在测试中定义的存根——假设没有模拟


这是真的吗?我已经试过了,但还是没能成功。这实际上是如何做到的?如何在没有模拟库的情况下在Python中存根方法?

下面是一个基本示例。请注意,从未调用生产getData()方法。它已经用一根木桩模拟出来了

import unittest
class ClassIWantToTest(object):

    def getData(self):
        print "PRODUCTION getData called"
        return "Production code that gets data from server or data file"

    def getDataLength(self):
        return len(self.getData())

class TestClassIWantToTest(unittest.TestCase):

    def testGetDataLength(self):
        def mockGetData(self):
            print "MOCK getData called"
            return "1234"

        origGetData = ClassIWantToTest.getData
        try:
            ClassIWantToTest.getData = mockGetData
            myObj = ClassIWantToTest()
            self.assertEqual(4, myObj.getDataLength())
        finally:
            ClassIWantToTest.getData = origGetData

if __name__ == "__main__":
    unittest.main()
Python函数是,因此您可以将任何函数分配给标识符:

班级人员:
def问候语(自我):
回答“嗨!”
def快乐问候(自我):
回答“嗨!你真棒!”
迈克=人()
迈克,你好你好
Person.问候语=快乐的问候语
迈克。问候语()#“嗨!你真棒!”
将方法标识符视为对某个函数的引用。通过更改引用,Python解释器将查找并执行它所引用的任何内容。但是,我建议您使用一些成熟的模块,而不是手工操作,比如,因为有很多陷阱,比如管理存根范围等等