Как заглушить методы Python без Mock - PullRequest
10 голосов
/ 12 октября 2010

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

1 Ответ

28 голосов
/ 12 октября 2010

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