【问题标题】:Django: check whether run as development or production when testing?Django:在测试时检查是否作为开发或生产运行?
【发布时间】:2017-01-05 01:30:17
【问题描述】:

我使用Django 1.9django.test 进行单元测试。

这是我测试signals的代码:

@receiver(post_save, sender=EmailNotification, dispatch_uid="spacegraphy")
def post_save_notification(sender, instance, created, **kwargs):
    if created:
        if settings.DEBUG:
            print("post_save: created!!!")
        else:
            instance.send_notification()

当我在本地运行此应用程序时,它以开发模式运行,将print(settings.DEBUG) 显示为True。 (我在shell_plusdjango-extension 中检查了它

但是,当我测试我的单元测试时,print(settings.DEBUG) 显示 False

我不知道为什么会这样。有什么想法吗?

【问题讨论】:

  • 这不是您用于“测试”信号的代码,这是您要测试的应用程序逻辑(如果我理解正确的话)。目前,您正试图检测应用程序逻辑中的测试条件,以便避免代码在现实世界中产生的副作用,但如果您遵循这条路径,您最终会得到混乱且无法维护的代码。这就是嘲笑的目的。
  • @ChidG 在应用程序逻辑中模拟? ...
  • @ user3595632 不,也许我不够清楚。我的意思是在测试中模拟,它应该与应用程序逻辑完全分离。
  • 假设新注册出现时有一个松弛通知。在开发模式下,我可能会因为某种原因必须注册。在这种情况下,它也会发送松弛通知,我不想这样做。
  • 当然,这是合理的,但您可以在那里进行某种形式的“模拟”——例如,使用项目设置中定义的“测试”松弛实例来发布。您可以使用类似的模式进行测试。如何构建取决于您自己,但您是对的,在某些情况下检查代码中的 DEBUG 状态是有效的。我不认为大量使用它是明智的。也许你应该看看 Django 如何处理电子邮件——即使用不同的后端进行开发/测试和生产——并遵循类似的模式。

标签: django unit-testing django-testing


【解决方案1】:

来自https://docs.djangoproject.com/en/1.10/topics/testing/overview/#other-test-conditions

无论配置文件中 DEBUG 设置的值如何,所有 Django 测试都以 DEBUG=False 运行。这是为了确保观察到的代码输出与生产环境中的输出相匹配。

我建议您以不同的方式编写测试。目的是测试代码在生产中运行的功能,因此不需要检查DEBUG 的值。

【讨论】:

  • 我需要分离模式的原因:我有一个功能可以在我的 Django 应用程序中发送松弛通知。但我不想在测试和开发模式下发送通知消息。那么我是否必须在测试中模拟信号?
  • 是的,嘲笑是通常的做法。我发现这个页面很好地解释了类似情况下的模拟obeythetestinggoat.com/book/chapter_16.html
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 2011-05-04
  • 2019-10-14
  • 2011-10-05
  • 2017-05-25
相关资源
最近更新 更多