Использование макетного патча для издевательства метода экземпляра

Я пытаюсь что-то издеваться над тем, что тестировал приложение Django, используя образную библиотеку тестирования Mock . Кажется, я не могу заставить его работать, я пытаюсь это сделать:

models.py from somelib import FooClass class Promotion(models.Model): foo = models.ForeignKey(FooClass) def bar(self): print "Do something I don't want!" test.py class ViewsDoSomething(TestCase): view = 'my_app.views.do_something' def test_enter_promotion(self): @patch.object(my_app.models.FooClass, 'bar') def fake_bar(self, mock_my_method): print "Do something I want!" return True self.client.get(reverse(view)) 

Что я делаю не так?

  • Конкатенация строки и целого числа в python
  • Каков официальный способ хранения настроек для программ python?
  • Передайте FILE * в функцию из Python / ctypes
  • Добавление поддержки SSL в SocketServer
  • Не удалось установить nltk на Mac OS El Capitan
  • Сообщение об ошибке для virtualenvwrapper на OS X Lion
  • Вызов функции Python из сценария оболочки
  • Как установить rpy2 в Mac OS X
  • 2 Solutions collect form web for “Использование макетного патча для издевательства метода экземпляра”

    Чтобы добавить ответ Кит, указав третий аргумент patch.object() , вы можете указать определенный patch.object() / метод. В противном случае используется объект MagicMock умолчанию.

      def fake_bar(self): print "Do something I want!" return True @patch.object(my_app.models.FooClass, 'bar', fake_bar) def test_enter_promotion(self): self.client.get(reverse(view)) # Do something I want! 

    Обратите внимание, что если вы укажете насмешливый объект, то по умолчанию MagicMock() больше не будет передаваться в исправленный объект – например, больше нет:

     def test_enter_promotion(self, mock_method): 

    но вместо:

     def test_enter_promotion(self): 

    http://www.voidspace.org.uk/python/mock/patch.html#patch-object

    Ах, я был смущен тем, где применять этот патч-декоратор. Исправлена:

     class ViewsDoSomething(TestCase): view = 'my_app.views.do_something' @patch.object(my_app.models.FooClass, 'bar') def test_enter_promotion(self, mock_method): self.client.get(reverse(view)) 
    Python - лучший язык программирования в мире.