2010-10-11 2 views
10

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

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

ответ

25

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

Спасибо, Питер. Это то, что я ищу. –

+0

Это именно то, что я искал, хотя я думал, что будет тяжелее =) – Sean