Django тестирует AssertionError для представления обновления

Я пытался создать Django тест для UpdateView

но у меня возникла такая проблема: self.assertEqual(application.credit_purpose, 'House Loan') AssertionError: 'Car Loan' != 'House Loan'

  • Автокредит
  • Дом Лоа

      def test_application_update(self):
      application = Application.objects.create(customer=self.customer, credit_amount=10000, credit_term=12,
                                                    credit_purpose='Car Loan', credit_pledge=self.pledge,
                                                    product=self.product,
                                                    number_request=2, date_posted='2020-01-01', reason='None',
                                                    repayment_source=self.repayment, possible_payment=1000,
                                                    date_refuse='2020-01-02', protokol_number='123457',
                                                    status=self.status,
                                                    language=0, day_of_payment=1, credit_user=self.user)
    
      response = self.client.post(
          reverse('application_update', kwargs={'pk': application.id}),
          {'credit_purpose': 'House Loan'})
    
      self.assertEqual(response.status_code, 200)
      application.refresh_from_db()
      self.assertEqual(application.credit_purpose, 'House Loan')
    

Итак, я тоже застрял в этом на некоторое время. Основная проблема находится в:

    ...
    response = self.client.post(
        reverse('application_update', kwargs={'pk': application.id}),
        {'credit_purpose': 'House Loan'}
    )
    ...

Я смог понять благодаря этому ответу. Это происходит потому, что вы отправляете сообщение в form, а он ожидает, что все поля заполнены, иначе он не пройдет валидацию и, следовательно, не вызовет .save().

Вы можете сделать следующее: после создания object скопируйте его данные в словарь, затем измените его перед размещением:

tests.py

from django.forms.models import model_to_dict

class ApplicationTestCase(TestCase):
    def setUp(self):
        customer = Customer.objects.create(...)
        ...
        self.data = {
            'customer': customer, 'credit_amount': 10000, 'credit_term': 12,
            'credit_purpose': 'Car Loan', ...
        }

    def test_application_update(self):
        application = Application.objects.create(**self.data)

        post_data = model_to_dict(application)
        post_data['credit_purpose'] = 'House Loan'

        response = self.client.post(
            reverse(
                'app:view-name', kwargs={'pk': application.id}),
                post_data
        )

        # print(application.credit_purpose)
        # application.refresh_from_db()
        # print(application.credit_purpose)

        # It returns a redirect so code is 302 not 200.
        self.assertEqual(response.status_code, 302)
        self.assertEqual(application.credit_purpose, 'House Loan')

Также, get_absolute_url() установлен в неправильном месте, должен быть под моделями:

models.py

class Application(AbstractCredit):
    ...

    def get_absolute_url(self):
        return reverse('app:view-name', kwargs={'pk': self.pk})
Вернуться на верх