Нам нужно увидеть больше вашего кода (в частности, create_question()
и как check_user_words
связан с сигналом), чтобы убедиться, но я думаю, что проблема в том, что вы используете обработчик сигнала post_save
для выполнения check_user_words()
.
Если это так, то причина, по которой ваш тест не пройден, заключается в том, что create_question()
вызовет сигнал post_save
, и check_user_words()
будет выполнен немедленно, то есть перед контекст with self.assertRaises
и, следовательно, ваш тест не пройден.
Если это так, попробуйте следующее:
def test_check_user_words(self):
with self.assertRaises(ValidationError):
create_question(question_text="What a minute bucko", days=1)
Теперь этот тест должен пройти, потому что ошибка проверки будетбыть брошенным, как только вы попытаетесь создать вопрос.
Обратите внимание, однако, что выполнение этого в сигнале приведет к неперехваченному исключению, когда что-то пытается сохранить объект.В зависимости от того, каков ваш вариант использования, вам может быть лучше сделать это в методе clean()
самой модели ( см. Документы здесь ), потому что это приведет к соответствующим ошибкам, сообщаемым в формах модели и т. Д.:
def clean(self):
for field in instance._meta.get_fields():
if (isinstance(field, models.CharField) and contains_bad_words(getattr(instance, field.attname))):
raise ValidationError("We don't use words like '{}' around here!".format(getattr(instance, field.attname)))
(а затем сбросьте обработчик сигнала).Затем вы можете проверить это с помощью:
q = create_question(question_text="What a minute bucko", days=1)
with self.assertRaises(ValidationError):
q.clean()