如何不在python manage.py test上运行celery任务

时间:2019-03-05 04:19:34

标签: django unit-testing celery

我有一个模型,我在post_save信号中向用户发送电子邮件和短信,我多次创建模型,因此它多次发送电子邮件和短信。

我计划编写用于测试短信和电子邮件的新测试。

def send_activation_mail_sms(sender, instance, created, **kwargs):
    if created :
        mobile_activation = UserMobileActivation.objects.create(user=instance,randomword=randomword(50),ref=ref)
        email_activation = UserEmailActivation.objects.create(user=instance,randomword=randomword(50),ref=ref)
        url_email = "{0}view/v1/email/activation/{1}/".format(HOSTNAME,email_activation.randomword)             short_url_email = url_shortener(long_url_email)
        url_sms = "{0}view/v1/mobile/activation/{1}".format(HOSTNAME,mobile_activation.randomword) 
        app.send_task("apps.tasks.send_sms",
                      args=[TEXTLOCAL_APIKEY,mobile_activation.stockuser.user.username ,'TXTLCL','Activate your mobile here {0}'.format(url_sms)])
        app.send_task("apps.tasks.send_email",
                      args=[email_activation.user.user.email, EMAIL_VERIFICATION_SUBJECT,
                            EMAIL_VERIFICATION_TEMPLATE, {"host": HOSTNAME, "verify_email_url": url_email}])

我在created信号中传递了post_save arg,有什么方法可以在这里传递额外的arg,这样在执行python manage.py test时它将跳过发送短信和电子邮件的过程。我使用版本控制的一种方式是我想使用不同版本的API进行测试,但由于这里没有request,因此我无法在此处捕获request.version。请提出建议。

1 个答案:

答案 0 :(得分:3)

首先在settings.py中设置一些变量,以标识当前正在使用的环境

# settings.py
MY_ENV = "DEVELOPMENT"

然后,根据 MY_ENV

运行celery任务/其他脚本
from django.conf import settings


def send_activation_mail_sms(sender, instance, created, **kwargs):
    if created and settings.MY_ENV == "DEVELOPMENT":
        # do your stuff

Django提供了在测试过程中覆盖设置配置的功能,请参阅文档Override Settings。因此,您可以在测试本身中覆盖 MY_ENV

相关问题