如何在没有Mock的情况下存根Python方法
我是一名C#dev开发人员,正在开发一些Python的东西,所以我现在还不知道自己在做什么。我已经读到,您并不真的需要Python的依赖注入。我被告知,您可以在代码中实例化对象,并让它们以您想要的方式运行,但是,您可以将这些对象上的方法指向我自己在测试中定义的存根——假设没有模拟如何在没有Mock的情况下存根Python方法,python,unit-testing,mocking,stub,Python,Unit Testing,Mocking,Stub,我是一名C#dev开发人员,正在开发一些Python的东西,所以我现在还不知道自己在做什么。我已经读到,您并不真的需要Python的依赖注入。我被告知,您可以在代码中实例化对象,并让它们以您想要的方式运行,但是,您可以将这些对象上的方法指向我自己在测试中定义的存根——假设没有模拟 这是真的吗?我已经试过了,但还是没能成功。这实际上是如何做到的?如何在没有模拟库的情况下在Python中存根方法?下面是一个基本示例。请注意,从未调用生产getData()方法。它已经用一根木桩模拟出来了 import
这是真的吗?我已经试过了,但还是没能成功。这实际上是如何做到的?如何在没有模拟库的情况下在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解释器将查找并执行它所引用的任何内容。但是,我建议您使用一些成熟的模块,而不是手工操作,比如,因为有很多陷阱,比如管理存根范围等等