Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试信号中的异常?_Python_Django_Unit Testing - Fatal编程技术网

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)