• 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

Fiszki IT
Fiszki IT
0 głosów
64 wizyt
pytanie zadane 21 listopada 2019 w Python przez Dawid89 Użytkownik (960 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 (298,560 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 Użytkownik (960 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 (298,560 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 Użytkownik (960 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 (298,560 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 Użytkownik (960 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ź 46 wizyt
pytanie zadane 24 maja w Python przez Mariusz Podgórski Początkujący (400 p.)
0 głosów
2 odpowiedzi 139 wizyt
pytanie zadane 18 listopada 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
2 odpowiedzi 2,514 wizyt
pytanie zadane 28 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

84,836 zapytań

133,644 odpowiedzi

296,137 komentarzy

56,080 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...