Как проверить результат отлова исключения в представлении python / django - PullRequest
0 голосов
/ 07 мая 2018

Учитывая представление, которое создает объект из модели, которая имеет 'unique_together' для двух полей, используя следующий код:

    def form_valid(self, form):
        field1 = form.cleaned_data['field1']
        field2 = form.cleaned_data['field2']
        try:
            TheModel.objects.create(org=self.request.org, field1=field1, field2=field2)
        except IntegrityError as e:
            if 'UNIQUE constraint' in e.message:
                messages.error(self.request, _('field1 already exists.'))
            return super(ModelFormMixin, self).form_valid(form)
        messages.success(self.request, _('Fields have been successfully updated.'))
        return super(ModelFormMixin, self).form_valid(form)

Как мне выполнить модульный тест, чтобы сообщение об ошибке отображалось, когда 'unique_together' выдает error ?

Мой текущий тест бросает TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.

Вот текущий тест:

    @patch.object(messages, 'error')
    def test_error_handling(self, error_mock):

        TheModel.objects.create(org=self.org, field1='somepath', field2='anotherpath2')

        with transaction.atomic():
            response = self.client.post(reverse('configurations.create_amodel', args=(self.org.slug,)),
                {'field1': 'somepath', 'field2': 'anotherpath'}, follow=True)
            self.assertTrue(error_mock.called)

Я не могу понять, как заставить тест работать (тестирование кода, запускаемого при обнаружении исключения)

Вот мой класс формы:

class RedirectForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    super(RedirectForm, self).__init__(*args, **kwargs)

field1 = forms.CharField(label='field1', required=True)
field2 = forms.CharField(label='field2', required=True)

class Meta:
    model = TheModel
    fields = ('field1', 'field2')

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я обнаружил, что всю проблему исключений, вызываемых внутри модели, удалось избежать, используя «TransactionTestCase» вместо «TestCase» в классе тестов:

т.е.

class CreateRedirectViewTests(TransactionTestCase):

тест для публикации сообщения об ошибке, когда вызывается исключение unique_together, тогда можно выполнить с помощью следующего:

@patch.object(messages, 'error')
def test_error_message(self, error_mock):

    self.client.post(reverse('configurations.create_amodel', args=(self.org.slug,)),
            {'field1': 'somepath', 'field2': 'anotherpath'}, follow=True)

    self.client.post(reverse('configurations.create_amodel', args=(self.org.slug,)),
            {'field1': 'somepath', 'field2': 'anotherpath'}, follow=True)
    self.assertTrue(error_mock.called)
0 голосов
/ 07 мая 2018

Вы можете получить сообщения из контекста ответа, а затем проверить наличие ошибок.

messages = list(response.context['messages'])
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), 'field1 already exists.')

Вы можете прочитать больше здесь: Как я могу протестировать сообщения django?

...