Патч Python не работает, звонки не записываются

Впервые работаю с MagicMock, и я думаю, что запутался.

Тестирование проекта django, поэтому в файле с именем services.py у меня есть эти важные элементы (крайне упрощенные и с вырезанием многих битов, конечно):

from django.template.loader import get_template

class Email:
    def send_success_attempt_email(self):
        template = get_template('emails/foo.html')

Я хочу проверить, что при вызове send_success_attempt_email вызывается get_template с правильными аргументами. Поэтому я написал тест с патчем:

@patch('django.template.loader.get_template')
def test_email_template_should_be_used(self, get_template):
    email = Email()
    email.send_success_attempt_email()
    print(get_template.call_count)
    get_template.assert_called_with('emails/foo.html')

Который печатает 0 вместо call_count и выдает

AssertionError nose.proxy.AssertionError: 
Expected call: get_template('emails/foo.html')
Not called

Я видел, что распространенной ошибкой является исправление неправильного экземпляра, но я пробовал много вариантов исправления (например, @patch('services.get_template')), но хотя это и изменяет ошибку (nose.proxy.EncodeError: Can't pickle <class 'unittest.mock.MagicMock'>: it's not the same object as unittest.mock.MagicMock), это не облегчает ее.

Я знаю, что у меня должно быть фундаментальное непонимание. Что это такое?


person fildred13    schedule 14.04.2016    source источник
comment
Возможный дубликат Python, имитирующий метод из импортированного модуля   -  person Dan Getz    schedule 14.04.2016
comment
Я согласен, это может быть дубликат, но, глядя на ответы на этот вопрос, я ожидаю, что @patch('services.get_template') сработает, но он выдает странную ошибку, которую я отредактировал в своих вопросах, чтобы подчеркнуть странность.   -  person fildred13    schedule 14.04.2016
comment
Нет, эта вторая ошибка на самом деле не связана с неправильным патчем, это что-то другое. Сообщение об ошибке сбило меня с толку, потому что я думал, что просто неправильно создаю патч.   -  person fildred13    schedule 14.04.2016
comment
Вместо этого попробуйте исправить ...services.get_template, так как сервисы могут быть загружены до того, как вы исправите, и сохраните исходную ссылку get_template до того, как вы ее исправите.   -  person Marco A.    schedule 14.04.2016