2012-05-11 4 views
6

У меня есть следующий сценарий:Mocking Django модели и сохранить()

в моем 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 !!! 

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

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

ответ

7

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

mock_foobar_class.save = save_mock 

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

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

mock_foobar_class.return_value.save = save_mock 

Я надеюсь, что помогает!

+2

Вы избили меня до ответа! – fuzzyman

+0

Upvote для ответа на мой запрос! Большое спасибо! –

+0

@matthew! Большое спасибо! –

Смежные вопросы