Mocking Django Model и save ()

У меня есть следующий сценарий:

в моих models.py

class FooBar(models.Model): description = models.CharField(max_length=20) 

в моем файле utils.py.

 from models import FooBar def save_foobar(value): '''acts like a helper method that does a bunch of stuff, but creates a FooBar object and saves it''' f = FooBar(description=value) f.save() 

в tests.py

 from utils import save_foobar @patch('utils.FooBar') def test_save_foobar(self, mock_foobar_class): save_mock = Mock(return_value=None) mock_foobar_class.save = save_mock save_foobar('some value') #make sure class was created self.assertEqual(mock_foobar_class.call_count, 1) #this passes!!! #now make sure save was called once self.assertEqual(save_mock.call_count, 1) #this fails with 0 != 1 !!! 

Это упрощенная версия того, что я пытаюсь сделать … поэтому, пожалуйста, не зацикливайтесь на том, почему у меня есть файл utils и вспомогательная функция для этого (в реальной жизни он делает несколько вещей). Кроме того, обратите внимание, что, хотя это упрощено, это фактический рабочий пример моей проблемы. Первый вызов для проверки call_count возвращает 1 и передает. Однако второй возвращает 0. Таким образом, мне кажется, что мой патч работает и получает вызов.

Как я могу проверить, что создается не только экземпляр FooBar, но и что вызван метод сохранения на нем?

One Solution collect form web for “Mocking Django Model и save ()”

Вот ваша проблема, в настоящее время у вас есть:

 mock_foobar_class.save = save_mock 

поскольку mock_foobar_class – это mock_foobar_class объект класса, и метод save вызывается в экземпляре этого класса (а не самого класса), вам нужно утверждать, что save вызывается для возвращаемого значения класса (aka instance).

Попробуй это:

 mock_foobar_class.return_value.save = save_mock 

Надеюсь, это поможет!

  • Как использовать метод unitest setUpClass ()?
  • Как запустить unittest в приложении Tkinter?
  • Проблема с sys.argv , когда модуль unittest находится в скрипте
  • Как я могу тестировать свою графическую программу с помощью Python и PyQt?
  • Как утверждать вывод с помощью nosetest / unittest в python?
  • Как насмехаться с клиентом redis в Python?
  • Код тестирования модуля Python, который вызывает функции python на уровне OS / Module
  • В Django, когда следует использовать доктрины вместо модульного тестирования?
  • Python - лучший язык программирования в мире.