如何不在 `python manage.py 测试中 运行 celery 任务

how not to run celery task on `python manage.py test`

我有一个模型,我在 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}])

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

最初在您的 settings.py 中设置一些变量以识别当前工作的环境

# settings.py
MY_ENV = "DEVELOPMENT"

然后,运行基于MY_ENV

的celery tasks/additional脚本
<b>from django.conf import settings</b>


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

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