Le problème a été résolu grâce à Thaian, en ajoutant une connexion au début de la fonction "test_create", car vous devez être connecté sur ce site pour utiliser le createview
J'écris actuellement un test pour un createview et je ne peux pas y poster de données.
L'objet testé a le modèle suivant
class Role(models.Model):
name = models.CharField(max_length=255)
linked_tenant = models.ForeignKey(Tenant, blank=True, null=True)
Et est utilisé dans la vue (générique) suivante
class RolCreate(TenantRootedMixin, CreateView):
model = RolTemplate
form_class = RoleForm
def get_form_kwargs(self):
kwargs = super(RolCreate, self).get_form_kwargs()
kwargs["linked_tenant"] = self.request.tenant
return kwargs
def form_valid(self, form):
form.instance.linked_tenant = self.kwargs.get("tenant")
return super(RolCreate, self).form_valid(form)
def get_success_url(self, **kwargs):
return reverse("rol_list", args=[self.request.tenant.slug])
Et c'est le test que j'utilise.
class RolCreate_tests(TestCase):
def setUp(self):
self.tenant = get_tenant()
self.role = get_role(self.tenant)
self.client = Client(HTTP_HOST="tc.tc:8000")
self.user = get_user(self.tenant)
def test_create(self):
response = self.client.post(reverse("rolcreate"), {"name" : "new_object"})
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name="new_object")
self.assertEqual(test_against, self.tenant)
L'affirmation qui renvoie l'erreur est la requête "get" à la fin.
DoesNotExist: Role matching query does not exist.
Donc, l'objet n'est pas créé, mais le test valide la vue 302, ce qui signifie qu'un post est en cours. Je ne comprends pas pourquoi ce test ne fait pas ce qu'il devrait. Quelqu'un pourrait-il m'aider ici?
=====
Après les suggestions de Thaians, j'ai obtenu les valeurs suivantes:
(Pdb) print(self.client.post)
<bound method Client.post of <django.test.client.Client object at 0x10f20da50>>
Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/?next=/my/role/create/">
(Pdb) print(response)
Vary: Cookie
Content-Length: 0
Content-Type: text/html; charset=utf-8
Location: /accounts/login/?next=/my/role/create/
Réponses:
2 pour la réponse № 1Avez-vous imprimé la réponse et vérifié ce retour peut-être?
La bonne idée est d'exécuter des tests avec PDB.
def test_create(self):
response = self.client.post(reverse("rolcreate"), {"name" : "new_object"})
import pdb; pdb.set_trace()
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name="new_object")
self.assertEqual(test_against, self.tenant)
ajoutez import pdb; pdb.set_trace () dans votre test, puis cochez self.client.post ().
Veuillez donc coller ce que contient la réponse.