Topic: Problema Django e testing di Model.save()  (Letto 49 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mad_griffith

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Problema Django e testing di Model.save()
« il: Luglio 06, 2019, 14:57 »
Salve, ho un problema con Django è più specificatamente con lo unit testing.

Ho un model “Question”
Ho un Model “Chioice” con il Model “Question” come foreign key
“Question” ha una proprietà is_published settata di default come False
Nel model “Choice” ho impostato nell’override di save() che la proprietà Question.is_published diventi true.

Nei test, quando faccio Question.objects.create() e poi Choice.objects.create() (referenziando come foreign key la Question appena creata), Quesion.is_published è sempre False!

Come faccio a testare correttamente questa cosa?
« Ultima modifica: Luglio 09, 2019, 12:06 da mad_griffith »

Offline bebo

  • python erectus
  • ***
  • Post: 238
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Problema Django e testing di Model.save()
« Risposta #1 il: Luglio 09, 2019, 10:54 »
Manchera' un commit, probabilmente.. Cosa c'e' di diverso rispetto alla documentazione di django?

Offline mad_griffith

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema Django e testing di Model.save()
« Risposta #2 il: Luglio 09, 2019, 12:11 »
Ciao bebo, purtroppo il versioning non c'entra nulla. Il problema che ho riguarda il codice di produzione vs quello di testing. Ora che accesso al PC (prima ero dal cell) posso incollare direttamente il codice:

Codice di produzione:

class Question(models.Model):
    ...
    is_published = models.BooleanField(default=False)


class Choice(models.Model):
    ...
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        Question.objects.filter(id=self.question.id).update(is_published=True)
        super(Choice, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        Question.objects.filter(id=self.question.id).update(is_published=False)
        super(Choice, self).save(*args, **kwargs)


Codice di testing:

    def test_question_with_choices_is_published(self):
        """
        A question with its choices entered is set as published
        """
        question = create_question(
            question_text="Question with choices", days=-5)
        choices = create_choices(
            choices_texts=('Choice 1', 'Choice 2', 'Choice 3'),
            question=question
        )

        question_is_published = Question.objects.get(
            id=question.id).is_published

        self.assertTrue(question_is_published)


def create_question(question_text, days):
    """
    Create a question with the given `question_text` and published the
    given number of `days` offset to now (negative for questions published
    in the past, positive for questions that have yet to be published).
    """
    time = timezone.now() + datetime.timedelta(days=days)
    return Question.objects.create(question_text=question_text, creation_date=time)


def create_choices(choices_texts, question):
    """
    Create as many choices as specified in the given `choices_texts` set and
    bound to the given `question` id integer.
    """
    choices = [
        Choice(
            choice_text=choice_text,
            question=question
        )
        for choice_text in choices_texts
    ]

    return Choice.objects.bulk_create(choices)
« Ultima modifica: Luglio 09, 2019, 12:16 da mad_griffith »