Как имитировать цепные методы на моделях Django

Я пытаюсь сделать что-то подобное, чтобы издеваться над методами модели Django, используя библиотеку макетов Python:

# file: tasks.py
def delete_ads(user):    
    # works fine and return a list of 4 MagicMock objects
    ads = Classifieds.objects.filter(
        user=user
    )

# file: tests.py
def test_delete_ads():
    return_list = [MagicMock(name='1'), MagicMock(name='2'), MagicMock(name='3'), MagicMock(name='4')]

    with patch('user.tasks.Classifieds') as classified_mock:
        classified_mock.objects.filter.return_value = return_value

Приведенный выше код работает нормально, но начинает возвращать один объект MagicMock после того, как я изменяю свой код на это:

# file: tasks.py
def delete_ads(user):    
    # works fine and return a list of 4 MagicMock objects
    ads = Classifieds.objects.filter(
        user=user
    ).order_by('-added')

# file: tests.py
def test_delete_ads():
    return_list = [MagicMock(name='1'), MagicMock(name='2'), MagicMock(name='3'), MagicMock(name='4')]

    with patch('user.tasks.Classifieds') as classified_mock:
        classified_mock.objects.filter.order_by.return_value = return_value

Могу ли я сделать это правильно, даже когда я связываю вызовы методов в моделях Django?


person Rafay    schedule 13.07.2014    source источник
comment
В вашем вопросе много опечаток. Вы уверены, что их нет и в вашем коде?   -  person Dunes    schedule 13.07.2014
comment
@Dunes Да, я почти уверен, что в моем коде нет опечаток. Я напечатал это отдельно.   -  person Rafay    schedule 13.07.2014


Ответы (1)


При имитации возвращаемого значения имитируемой функции вы должны имитировать функцию так, как она будет вызываться в коде. parent.child создает атрибут с именем child в макете parent. Принимая во внимание, что parent().child создает атрибут с именем child для фиктивного возвращаемого значения parent().

person Dunes    schedule 13.07.2014