• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

testowanie modelu z kluczami obcymi - pytest + django

VPS Starter Arubacloud
0 głosów
191 wizyt
pytanie zadane 21 listopada 2019 w Python przez Dawid89 Obywatel (1,100 p.)

Hej,

Męcze się z próbą przetestowania pól ForeignKey i  ManyToMany. Próbowałem kilku kombinacji ale zawsze dostaje jakiś błąd. Przy poniższym rozwiązaniu jest to:

AttributeError: 'ManyRelatedManager' object has no attribute 'title'

Do tworzenia obiektów w testach korzystam z mixera.

 def test_if_homepage_choosen_and_display_carousel_is_correct(self):
        carousel = mixer.blend('pages.Carousel', title='test')
        homepage = mixer.blend('pages.Homepage', display_carousel=False, carousel=carousel)
        assert homepage.display_carousel == False
        assert homepage.carousel.title == carousel.title
class Homepage(models.Model):

    carousel = models.ManyToManyField('Carousel', verbose_name='Slajdy', blank=True)
    gallery = models.OneToOneField('Gallery', related_name='gallery', verbose_name='Galeria', on_delete=models.CASCADE, null=True, blank=True)

 

1 odpowiedź

0 głosów
odpowiedź 21 listopada 2019 przez adrian17 Ekspert (344,100 p.)
To nie ma związku z testowaniem, tylko z użyciem ManyToManyField.

Skoro używasz ManyToManyField, to `carousel` jest zbiorem karuzel (więc pewnie nazwa `carousels` byłaby czytelniejsza), więc trzeba z niego korzystać jak z bazowego modelu, na przykład `homepage.carousels.all()`

Jeśli jednak nie chcesz żeby homepage miał wiele karuzel, to ManyToManyField nie jest tutaj dobrą opcją.
komentarz 21 listopada 2019 przez Dawid89 Obywatel (1,100 p.)

W karuzeli obiekty to pojedyncze slide'y więc może być ich wiele. 

Powiedzmy, że chce przetestować czy homepage dostaje odpowiedni obiekt1 z karuzeli.

Nie wiem za bardzo jak to ogarnąć o czym piszesz:

    def test_if_homepage_choosen_and_display_carousel_is_correct(self):
        carousel = mixer.blend('pages.Carousel', title='test')
        homepage = mixer.blend('pages.Homepage.carousel.all()', display_carousel=False, carousel=carousel)
        assert homepage.display_carousel == False
        assert homepage.title == carousel.title

tutaj dostaje: 

 ValueError: too many values to unpack (expected 2)

 

komentarz 21 listopada 2019 przez adrian17 Ekspert (344,100 p.)

W karuzeli obiekty to pojedyncze slide'y więc może być ich wiele. 

Ale to tylko znaczy że karuzela ma kilka slide'ów, tak? A czy homepage może mieć kilka karuzel?

    homepage = mixer.blend('pages.Homepage.carousel.all()', display_carousel=False, carousel=carousel)

Um, co? Czemu tutaj? Miałem na myśli miejsce gdzie już używasz te obiekty, czyli to miejsce:

       assert homepage.carousel.title == carousel.title
komentarz 21 listopada 2019 przez Dawid89 Obywatel (1,100 p.)

Ale to tylko znaczy że karuzela ma kilka slide'ów, tak? A czy homepage może mieć kilka karuzel?

Homepage może mieć tylko 1 karuzelę ale tworząc/edytując homepage mogę sobie wybrać kilka pojedynczych slide'ów dzięki ManyToMany. Gdyby nie to to tylko w modelu karuzeli mógłbym określić które slide'y mają się wyświetlać. Chyba, że coś pomieszałem. 

Um, co? Czemu tutaj? Miałem na myśli miejsce gdzie już używasz te obiekty, czyli to miejsce:

W assercie też próbowałem i bez powodzenia bo nie wiem jak przekazać do porównania konkretne pole. Poniżej porównuje pierwszy obiekt a nie jedno z jego pól :

assert homepage.carousel.first() == carousel.title

 

komentarz 21 listopada 2019 przez adrian17 Ekspert (344,100 p.)

Poniżej porównuje pierwszy obiekt a nie jedno z jego pól :

To... porównaj jego pole?

homepage.carousel.first().title

Homepage może mieć tylko 1 karuzelę

Czyli ManyToMany nie ma sensu.

ale tworząc/edytując homepage mogę sobie wybrać kilka pojedynczych slide'ów dzięki ManyToMany

No... nie, teraz ustawiasz wiele karuzel, nie wiele slajdów w jednej karuzeli. Chyba że czegoś nie rozumiem w modelu? (bo nie pokazałeś definicji modelu Carousel)

komentarz 22 listopada 2019 przez Dawid89 Obywatel (1,100 p.)

To... porównaj jego pole?

homepage.carousel.first().title

Kurczę, myślałem, że próbowałem wcześniej w ten sposób i nie działało  ale teraz jest ok. A w przypadku OneToOne rozumiem, że jest po prostu homepage.carousel.title ? Bo taka wersja działa.  

No... nie, teraz ustawiasz wiele karuzel, nie wiele slajdów w jednej karuzeli. Chyba że czegoś nie rozumiem w modelu? (bo nie pokazałeś definicji modelu Carousel)

 

model Carousel:

class Carousel(models.Model):

    '''

    Front page carousel

    '''

    title = models.CharField('Tytuł', max_length=100)
    subtitle = models.TextField('tekst pod tytułem', null=True, blank=True)
    display = models.BooleanField('wyświetl', default=True)
    img = OptimizedImageField('Plik', upload_to='slider')
    button_name = models.CharField('Nazwa przycisku', max_length=25, null=True, blank=True)
    button_url = models.CharField('URL przycisku', max_length=200, null=True, blank=True)
    created = models.DateTimeField('Utworzono', auto_now_add=True)
    updated = models.DateTimeField('Zmodyfikowano', auto_now=True)

    class Meta:
        verbose_name = 'Slider'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

Dzięki temu w homepage mogę sobie wybrać od razu pojedyncze slidy:

Bo jeżeli miałbym OneToOne to wybierałbym tylko karuzelę. Wtedy tylko w  modelu karuzeli mógłbym wybierać aktywne slidy. 

 

Podobne pytania

0 głosów
1 odpowiedź 284 wizyt
pytanie zadane 24 maja 2021 w Python przez Mariusz Podgórski Początkujący (400 p.)
0 głosów
1 odpowiedź 177 wizyt
0 głosów
2 odpowiedzi 226 wizyt
pytanie zadane 18 listopada 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...