SetUp(self) ou setUpTestdata(cls)
salut,
on utilise dans les tests la méthode setUp pour "factoriser" le code et le rendre dispo pour toutes les méthodes de tests. Je viens de lire qu'il existe une méthode de classe, qui permettrait de gagner en performance du fait qu'elle ne serait éxecutée qu'une seule fois avant tous les tests alors que la 1ere est exécutée avant chaque test. Dans les exemples que Thibault nous montre dans les vidéos, les données créées ne sont pas amenées à être modifiées par les tests, peut-on utiliser la méthode setUpTestData alors?
Merci.
Ali
Bonjour
Tu peux très bien utilise setUpTestData.
La méthode setUpTestData est une méthode de classe qui est exécutée une seule fois avant l'exécution de tous les tests de la classe. Du coup tu as des données de test qui restent constantes tout au long de l'exécution des tests de cette classe.
Pour ton cas tu pourrais vite de mettre à pytest avec les fixtures et ses scopes (je te laisse regarder ^^).
pytest-django est plus intuitif et plus "léger" d'utilisation je trouve. Alors je fais tout en fonctions.
J'aime beaucoup la façon de faire pytest avec un fichier avec des fixtures :
@pytest.fixture
def presentation():
return CompanyPresentation.objects.create(title="presentation", text="super texte !")
@pytest.fixture
def user_1():
return CustomUser.objects.create_user(email="[email protected]", username="gabigab117", first_name="Trouvé",
last_name="Gabriel", password="12345678")
@pytest.fixture
def company_1():
return Company.objects.create(name='pygabdev', phone="0144865112", email="[email protected]")
@pytest.fixture
def company_2():
return Company.objects.create(name='pyeldev', phone="0144865113", email="[email protected]")
fixtures que tu utilises dans tes tests :
import pytest
from pytest_django.asserts import assertRedirects
from django.test import Client
from django.urls import reverse
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from account.models import CustomUser, Company
from account.verification import email_verification_token
@pytest.mark.django_db
def test_signup_post_with_activation(client: Client, mailoutbox, presentation):
# Given a user wants to create an account
data = {"email": "[email protected]", "username": "test", "last_name": "Trouvé", "first_name": "Patrick",
"password1": "Roger_12345678", "password2": "Roger_12345678"}
client.post(reverse("account:signup"), data=data)
# print(response.context['form'].errors)
user = CustomUser.objects.get(email="[email protected]")
# When user submits the form,
# Then his account is not active and an email is sent
assert user.is_active is False
assert len(mailoutbox) == 1
# When user wants to activate his account
uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
token = email_verification_token.make_token(user)
url = reverse("account:activate", kwargs={"uidb64": uidb64, "token": token})
r = client.get(url)
user.refresh_from_db()
# Then his account is active
assert user.is_active
assertRedirects(r, reverse("index"), 302)
@pytest.mark.django_db
def test_add_company_view(client: Client, user_1):
# Given user who add a company
client.force_login(user_1)
# When user submits the form,
data = {"address_1": "adresse", "city": "Ons en Bray", "zip_code": "60650", "country": "fr",
"name": "py", "phone": "0344785145", "email": "[email protected]", "website": "www.g.com"}
client.post(reverse("account:add-company"), data)
company = Company.objects.get(name="py")
# Then a company with address is created, and user has admin status perm
assert company.companyaddress.city == "Ons en Bray"
assert user_1.has_perm("account.company_admin_status")
@pytest.mark.django_db
def test_select_company_view(client: Client, user_1, company_1: Company, company_2):
# Given user who select a company
company_1.users.add(user_1)
client.force_login(user_1)
r = client.get(reverse("account:select-company"))
# in the list of choices there are only the companies of which the user is a part
assert "pygabdev" in str(r.content)
assert "pyeldev" not in str(r.content)
# When user submits the form
r = client.post(reverse("account:select-company"), data={"company": company_1.id})
# Then the session has a key "company" with the name and id of company instance
assert client.session["company"] == f"{company_1.name} id {company_1.identification}"
assertRedirects(r, reverse("account:select-company"), 302)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte