Тест validate_unique вызывает ValidationError Django forms

У меня есть ModelForm под названием SignUpForm, расположенная в myproj.accounts.forms

SignUpForm переопределяет validate_unique от Django, чтобы поле 'email' было исключено из проверки 'unique', как того требует unique=True модели (это будет рассмотрено позже в представлении). Все работает, как и ожидалось.

Теперь я хочу проверить код, вызвав ошибку ValidationError при вызове self.instance.validate_unique(exclude=exclude).

Проблема, с которой я столкнулся, заключается в том, как использовать mock для исправления instance.validate_unique так, чтобы возникала ошибка ValidationError.

SignUpForm's validate_unique(self) - myproj.accounts.forms

    def validate_unique(self):
        exclude = self._get_validation_exclusions()
        exclude.add('email')

        try:
            self.instance.validate_unique(exclude=exclude)
        except forms.ValidationError as e:
            self._update_errors(e)

Этот тест работает, но он не поднимает ошибку на методе (validate_unique), а не на экземпляре (self.instance.validate_unique).

    def test_validate_unique_raises_exception(self):
        with patch.object(SignUpForm, 'validate_unique') as mock_method:
            mock_method.side_effect = Exception(ValidationError)
            data = {"email": 'someone@somewhere.com',
                    'full_name': A User,
                    "password": "A19A23CD",
                    }
            form = SignUpForm(data)
            self.assertRaises(ValidationError)

Мой вопрос в том, как я могу поднять ValidationError, используя mock, когда вызывается self.instance.validate_unique?

В конце концов, решением было переписать мою переопределение validate_unique() так, чтобы при обнаружении существующего адреса электронной почты всегда возникала ошибка ValidationError, после чего 'email' можно удалить из error_dict с помощью .pop('email'):

    def validate_unique(self):
        exclude = self._get_validation_exclusions()
        try:
            self.instance.validate_unique(exclude=exclude)

        except forms.ValidationError as e:
            e.error_dict.pop('email')
            self._update_errors(e)

Который можно проверить следующим образом:

class SignUpFormTest(TestCase):

    def setUp(self):
        self.email = "testclient@example.com"
        self.full_name = "test user"

        self.user = CustomUser.objects.create_user(email='a@a.com',
                                                   full_name='A Aaa',
                                                   password='A19A23CD',
                                                   )

    @patch.object(SignUpForm, '_get_validation_exclusions')
    def test_unique(self, mock_it):
        data = {
            "email": self.user.email,
            'full_name': self.user.full_name,
            "password": "A19A23CD",
        }

        mock_it.return_value = {'company', 'id', 'date_joined', 'last_login', 'is_active', 'is_verified', 'is_superuser', 'is_staff'}

        form = SignUpForm(data)
        self.assertFalse(form.has_error('email'))
        self.assertRaises(ValidationError, form.instance.validate_unique)

Вернуться на верх