2017-09-06 44 views
0

我有以下简单的控制器测试装饰API路线瓶

@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()) 

的DAO是由@inject_repository(CompanyRepository)

注入我不这样做,然而,得到的是在测试时发生的事情:

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) 

我收到以下错误

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

控制器是否被修饰?


装饰代码

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 
+0

'inject_repository'从哪里来?你能显示代码吗? –

+0

我已编辑@DanielRoseman –

回答

1

你不是传递的参数从你的装饰来装饰功能。

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

是的,谢谢你的帮助@DanielRoseman 为什么API能正常工作?测试时只是抛出异常。 –