Python 如何测试信号中的异常?
我有一个信号:Python 如何测试信号中的异常?,python,django,unit-testing,Python,Django,Unit Testing,我有一个信号: create_flat_referral = django.dispatch.Signal(providing_args=["request", "user"]) 我有一个接收器: @receiver(create_flat_referral, sender=None) def save_flat_referral(sender, request, user, **kwargs): referral_link = request.POST.get('referral'
create_flat_referral = django.dispatch.Signal(providing_args=["request", "user"])
我有一个接收器:
@receiver(create_flat_referral, sender=None)
def save_flat_referral(sender, request, user, **kwargs):
referral_link = request.POST.get('referral', None)
if not referral_link:
referral_link = request.GET.get('ref', None)
try:
if referral_link:
link = Link.objects.get(token = referral_link)
referral = FlatReferral.objects.create(
referrer = link.user,
referred = user
)
except Link.DoesNotExist:
logger.exception('...')
except ValidationError:
logger.exception('...')
我想涵盖所有测试的例外情况
除了我想要获得的assertRaises
,我还想要获得assertraisemsessage
最好的方法是什么
如果我想做这样的事情:
self.assertRaises(
ValidationError,
lambda: signals.create_flat_referral.send(
sender = None,
request = post_request,
user = self.referred
)
)
from django.test import TestCase, RequestFactory
class MySignalTestCase(TestCase):
def test_link_does_not_exist(self):
# Create a dummy request that you can give to your signal handler
factory = RequestFactory()
request = factory.post('/') # Pass appropriate params here if needed
with self.assertRaises(ValidationError):
# sender isn't used, hence you can just pass None there.
save_flat_referral(sender=None, request=request)
我考试不及格:
AssertionError:ValidationError不是由lambda引发的
AssertionError:ValidationError不是由lambda引发的
可调用的定义是func名称,而不是func()调用
e、 g,这将作为cal\u exp
is func name工作
self.assertRaises(OverflowError, MathOverFlow().cal_exp, 2)
这将不起作用,因为cal\u exp(2)
对断言无效
self.assertRaises(OverflowError, MathOverFlow().cal_exp(2))
我个人更喜欢这样:
d = {'sender': None, 'request': post_request, 'user': self.referred}
with self.assertRaises(ValidationError):
signals.create_flat_referral.send(**d)
或带有**kwargs
的func名称,而不是func(**kwargs)
我找不到lamda的位置,或者至少它使这里的事情变得比必要的更复杂。你需要测试你的信号处理程序本身,而不是Django的信号框架(Django自己完全测试过)。因此,您不需要经历触发实际信号的所有麻烦-您可以直接使用模拟参数调用您的函数,并检查它是否正确处理它们-类似于以下内容:
self.assertRaises(
ValidationError,
lambda: signals.create_flat_referral.send(
sender = None,
request = post_request,
user = self.referred
)
)
from django.test import TestCase, RequestFactory
class MySignalTestCase(TestCase):
def test_link_does_not_exist(self):
# Create a dummy request that you can give to your signal handler
factory = RequestFactory()
request = factory.post('/') # Pass appropriate params here if needed
with self.assertRaises(ValidationError):
# sender isn't used, hence you can just pass None there.
save_flat_referral(sender=None, request=request)