Parece que no puedo burlarme del comportamiento de un formulario cuando las vistas de prueba unitarias.
Mi formulario es un ModelForm simple y reside en profiles.forms . La vista es (nuevamente) una vista simple que verifica si el formulario es válido y luego lo redirige.
vistas.py
from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from profiles.forms import ProfileForm def home(request): form = ProfileForm() if request.method == 'POST': form = ProfileForm(request.POST) if form.is_valid(): profile = form.save() return HttpResponseRedirect(reverse("thanks"))Mi prueba se ve así:
class TestViewHomePost(TestCase): def setUp(self): self.factory = RequestFactory() def test_form(self): with mock.patch('profiles.views.ProfileForm') as mock_profile_form: mock_profile_form.is_valid.return_value = True request = self.factory.post(reverse("home"), data={}) response = home(request) logger.debug(mock_profile_form.is_valid.call_count) # "0" is_valid no se llama en el simulacro, lo que significa que ProfileForm no está parcheado.
¿Dónde cometí un error?
Pude arreglar la burla is_valid de la siguiente manera:
def test_form(self): with mock.patch('profiles.views.ProfileForm.is_valid') as mock_profile_form: mock_profile_form.return_value = True request = self.factory.post(reverse("home"), data={}) response = home(request) nota: y podría usar mock_profile_form.assert_called_once() para verificar si se ha llamado al simulacro.