Существует несколько определений объектов, которые не являются реальными. Общий термин - тест двойной. Ссылка Согласно
- Объекты Dummy передаются, но никогда не используются. Обычно они используются для заполнения списков параметров.
- Фальшивые объекты фактически имеют рабочие реализации, но обычно используют некоторый ярлык, который делает их непригодными для производства (в качестве примера используется база данных с памятью).
- Штукеры предоставляют консервированные ответы на вызовы, сделанные во время теста, обычно вообще не реагируют на что-либо вне того, что запрограммировано для теста. Stubs также может записывать информацию о вызовах, таких как заглушка шлюза электронной почты, которая запоминает отправленные сообщения, или, может быть, только то, сколько сообщений он отправил.
- Mocks - это то, о чем мы говорим здесь: объекты, запрограммированные ожиданиями, которые формируют спецификацию ожидаемых вызовов.
Стиль
Mocks vs Stubs = Поведенческое тестирование vs State тестирование
Принцип
Согласно принципу Проверяйте только одну вещь на тест , в одном тесте может быть несколько заглушек, но обычно есть только один mock
Жизненный цикл
Жизненный цикл тестирования с заглушками:
- Настройка - подготовить тестируемый объект и его коллабораторы.
- Упражнение - проверить функциональность.
- Проверить состояние - использовать утверждения для проверки состояния объекта.
- Teardown - очистка ресурсов.
Test жизненный цикл с mocks:
- Данные установки - Подготовьте объект, который bein g
- Ожидания настройки - Подготовьте ожидания в макете, который используется первичным объектом.
- Упражнение - проверьте функциональность.
- Проверьте ожидания - убедитесь, что правильные методы были вызваны в mock.
- Проверить состояние - использовать утверждения для проверки состояния объекта.
- Teardown - очистить ресурсы.
Резюме
Оба теста mocks и stubs дают ответ на вопрос: Каков результат?
Тестирование с помощью mocks также интересует: How результат был достигнут?
Хорошо, я нашел рабочее решение для этого. Вот мое решение.
Я изменил forms.py
следующим образом
from django import forms
from accounts.tasks import send_mail
from django.contrib.auth.forms import PasswordResetForm as PasswordResetFormCore
class PasswordResetForm(PasswordResetFormCore):
email = forms.EmailField(max_length=254, widget=forms.TextInput(
attrs={
'class': 'form-control',
'id': 'email',
'placeholder': 'Email'
}
))
def send_mail(self, subject_template_name, email_template_name, context,
from_email, to_email, html_email_template_name=None):
context['user'] = context['user'].id
send_mail.delay(subject_template_name=subject_template_name,
email_template_name=email_template_name,
context=context, from_email=from_email, to_email=to_email,
html_email_template_name=html_email_template_name)
И измененный tasks.py
похож на следующий
from __future__ import absolute_import, unicode_literals
from accounts.models import User
from django.contrib.auth.forms import PasswordResetForm
@shared_task
def send_mail(subject_template_name, email_template_name, context,
from_email, to_email, html_email_template_name):
context['user'] = User.objects.get(pk=context['user'])
PasswordResetForm.send_mail(
None,
subject_template_name,
email_template_name,
context,
from_email,
to_email,
html_email_template_name
)