【问题标题】:Pytest / Django: How to change a decorator that is defined during build time?Pytest / Django:如何更改在构建时定义的装饰器?
【发布时间】:2022-01-23 23:19:04
【问题描述】:

我正在发出一个网络请求,并给它一个 10 秒的超时时间。 超时由从settings 读取时间限制的装饰器引发,因此看起来像这样:

@timeout(settings.TIMEOUT).

问题是我希望测试超级快,所以我把超时时间改成0.1:

settings.TIMEOUT = 0.1

问题是当我尝试测试装饰器时,装饰器已经是initialized(我可能使用了错误的词)。所以装饰器是在构建时创建/定义的,然后我更改了设置,但为时已晚,装饰器不再读取更新的设置。

这是一个简化版:

##############
settings.py
###############

TIMEOUT = 10
###############
request_maker.py
###############

from timeout_decorator import timeout
from django.conf import settings
from time import sleep

class MakeRequest

    @timeout(settings.TIMEOUT)
    def make_the_request(self):
        sleep(100)
###############
tests.py
###############

import pytest
from timeout_decorator import TimeoutError
from request_maker import MakeRequest


def test_make_request(settings):
    
    settings.TIMEOUT = 0.1

    mr = MakeRequest()

    with pytest.raises(TimeoutError) as e:
        mr.make_the_request()   # < Even though TIMEOUT is 0.1, it actually times out for 10 seconds

如何更改代码,以便在生产期间为@timeout(10),在测试期间为@timeout(0.1)?

【问题讨论】:

    标签: django testing pytest python-decorators


    【解决方案1】:

    您的settings.py 中应该有DEBUG 变量,并假设您从.env 初始化此变量以确定它是否产生。然后您可以根据DEBUG 变量在settings.py 中初始化TIMEOUT 变量,如下所示:

    DEBUG = os.getenv("DEBUG") == "True"
    TIMEOUT = 0.1 if DEBUG else 10
    

    【讨论】:

    • 这很简单,很有意义,谢谢!
    • @user1367204 解决了您的问题吗?
    • @YevgeniyKosmak,是的!
    【解决方案2】:

    为了解决这个问题,我做了两件事:

    1. 我改变了模块的加载方式:
    import request_maker
    
    1. 我更新设置后重新加载了模块
    settings.TIMEOUT = 0.1
    reload(request_maker)
    
    

    这是完整的新代码:

    ###############
    tests.py
    ###############
    
    import pytest
    from timeout_decorator import TimeoutError
    import request_maker
    from importlib import reload
    
    
    def test_make_request(settings):
        
        settings.TIMEOUT = 0.1
        reload(request_maker)
    
        mr = request_maker.MakeRequest()
    
        with pytest.raises(TimeoutError) as e:
            mr.make_the_request()   # < Sleeps for 0.1 seconds only!
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2012-08-02
      • 2022-08-15
      • 2020-05-19
      • 2022-01-09
      相关资源
      最近更新 更多