I\'m a C# dev moving into some Python stuff, so I don\'t know what I\'m doing just yet. I\'ve read that you don\'t really need Dependency Injection with Python. I\'ve been told
Here's a basic example. Note that the production getData() method is never called. It has been mocked out with a stub.
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 functions are first-class objects, so you can assign any function to the identifier:
class Person:
def greetings(self):
return "Hi!"
def happy_greetings(self):
return "Hi! You're awesome!"
mike = Person()
mike.greetings() # "Hi!"
Person.greetings = happy_greetings
mike.greetings() # "Hi! You're awesome!"
Think of method identifier as a reference to some function. By changing the reference, Python interpreter will find and execute whatever it refers to. However, instead of doing this by hand, I suggest you using some mature module, like unittest.mock, since there are plenty of pitfalls like managing stub scope, etc.