简体   繁体   English

在Flask中测试经过修饰的API路由

[英]Testing a decorated API route in Flask

I have the following simple controller 我有以下简单的控制器

@companies.route('/companies/<int:id>', methods=['GET'])
@inject_repository(CompanyRepository)
def get_company(repository, id):
    """
    GET /companies/id
    """
    company = repository.get(pk=id)
    return jsonify(company.to_json())

The DAO is being injected by @inject_repository(CompanyRepository) DAO由@inject_repository(CompanyRepository)注入

I do not, however, get what is happening at test time: 但是,我不了解测试时发生的情况:

def test_get_company(self):

    response = self.client.get(url_for('companies.get_company', id=1))
    data = json.loads(response.get_data(as_text=True))

    assert_equal(response.status_code, 200)

I get the following error 我收到以下错误

TypeError: get_company() missing 1 required positional argument: 'id'

Isn't the controller being decorated? 控制器没有装饰吗?


Decorator code 装饰代码

def inject_repository(repository_class):

    def decorator(func):

        @wraps(func)
        def wrapper(*args, **kwargs):

            if 'psql' in class_init_fields(repository_class):
                repository = psql_repository_for(
                    repository_model=repository_class,
                    connection_meta=current_app.config['POSTGRESQL'])

            else:
                raise ValueError("'{}' repository cannot be injected".format(repository_class.__name__))

            return func(repository=repository)

        return wrapper

    return decorator

You're not passing the arguments on from your decorator to the decorated function. 您没有将参数从装饰器传递到装饰的函数。

def wrapper(*args, **kwargs):
    ...
    kwargs['repository'] = repository
    return func(*args, **kwargs)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM