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})