我是编程和Django的新手。我正在尝试测试我的功能之一,以确保引发验证错误。测试确认出现了错误,但也表示测试失败。这怎么可能?
value price <br>
101 25 <br>
102 35 <br>
103 45 <br>
value Price <br>
101 5% <br>
102 6% <br>
103 7% <br>
答案 0 :(得分:1)
我们需要查看更多代码(尤其是create_question()
以及check_user_words
与信号的连接方式),但是我认为问题在于您使用的是{{1} }信号处理程序以执行post_save
。
如果是这种情况,则您的测试失败的原因是check_user_words()
将触发create_question()
信号,并且post_save
将立即执行-即check_user_words()上下文之前,因此您的测试失败。
如果是这种情况,请尝试以下操作:
with self.assertRaises
现在该测试应该通过,因为一旦您尝试创建问题,就会引发验证错误。
但是请注意,在某些情况下尝试保存对象时,在信号中执行此操作将导致未捕获的异常。根据您的用例,最好在模型本身(see docs here)的def test_check_user_words(self):
with self.assertRaises(ValidationError):
create_question(question_text="What a minute bucko", days=1)
方法中执行此操作,因为这将导致在模型表单等上报告适当的错误:< / p>
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)))