Как заглушить методы Python без Mock

Я - С# dev, переходящий в некоторые вещи на Python, поэтому я не знаю, что я делаю. Я читал, что вам действительно не нужна инъекция зависимостей с Python. Мне сказали, что вы можете создавать объекты в своем коде и запускать их так, как вы хотите, однако вы можете указывать методы на этих объектах на мои собственные заглушки, определенные в моих тестах - предположительно без макетов.

Это правда? Я пытался это сделать и не могу заставить его работать. Как это делается? Как заблокировать метод в Python без насмешливой библиотеки?

Ответ 1

Вот базовый пример. Обратите внимание, что метод 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()