sun*_*nny 5 python unit-testing mocking pytest flask
我想validate_token在编写视图的单元测试时模拟装饰器
#views.py
from third_part.module import vaidate_token
from setting import config
class myViews:
     @validate_token([config['issuer'], config['secret_key']])
     def get_data():
         #Do stuff
         return json.loads(data)
这里validate_token是一个thirtd_party模块,用于授权请求,令牌是由第三方发行的,所以我不想为我的测试执行validate_token装饰器
以下是我的示例测试代码。
test_views.py
@patch('views.validate_token', lambda x: x)
def test_get_data(self):
    endpoint = '/app/get_data'
    res = self.client.get(endpoint)
    assert res.status_code==200
我在运行测试时尝试进行模拟,
但是它没有按预期运行,出现401错误。
我怎样才能模拟/补丁装饰器进行测试,这里缺少什么
提前致谢。
这是一个可以帮助您的示例。下面的文件结构。
app.py
from flask import Flask
from third_part.example import validate_token
app = Flask(__name__)
@app.route('/')
@validate_token()
def index():
    return 'hi'
if __name__ == '__main__':
    app.run(debug=True)
/third_part/example.py
from functools import wraps
def validate_token():
    def validate(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            raise Exception('Token error. Just for example')
            return func(*args, **kwargs)
        return wrapper
    return validate
tests.py:
from app import app
app.testing = True
def test_index():
    with app.test_client() as client:
        client.get('/')
运行我们的tests.py(只需确保装饰器正常工作):
    @wraps(func)
    def wrapper(*args, **kwargs):
>       raise Exception('Token error. Just for example')
E       Exception: Token error. Just for example
第一种方法如何跳过装饰器(使用patch)。tests.py:
from functools import wraps
from mock import patch
def mock_decorator():
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            return f(*args, **kwargs)
        return decorated_function
    return decorator
patch('third_part.example.validate_token', mock_decorator).start()
# !important thing - import of app after patch()
from app import app
app.testing = True
def test_index():
    with app.test_client() as client:
        client.get('/')
第二种方式(无patch)。tests.py:
from functools import wraps
from third_part import example
def mock_decorator():
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            return f(*args, **kwargs)
        return decorated_function
    return decorator
# !important thing - import of app after replace
example.validate_token = mock_decorator
from app import app
app.testing = True
def test_index():
    with app.test_client() as client:
        client.get('/')
运行我们的test.py(有两种方式):
tests.py .                                                               [100%]
=========================== 1 passed in 0.09 seconds ===========================
总结。如您所见,非常重要的一点是替换函数。顺便说一句,您尝试打补丁validate_token的views模块,但不是third_part.module
希望这可以帮助。
| 归档时间: | 
 | 
| 查看次数: | 1735 次 | 
| 最近记录: |