2016-06-10 8 views
1

프레임 워크 을 사용하고 있습니다. 나는 코드 나는이 기능의 UT를 쓰고모의 병. 파이썬에있는 요청 객체

from bottle import request 

def abc(): 
    x = request.get_header('x') 
    ... 
    ... 
    data = request.json() 
    ... 
    ... 

처럼, 내가 get_headerbottle.requestjson을 조롱하고, 그에서 내 모의 데이터를 반환 할 수 있습니다.

시도해 보았습니다.

from mock import patch 

@patch('bottle.request.headers', return_value={'x': 'x'}) 
@patch('bottle.request.json', return_value=...) 
def test_abc(self, _, __): 
    ... 
    ... 

그러나 이것은 request.headers이 읽기 ​​전용이기 때문에 오류를 발생시킵니다. 나는 또한 request.json을 조롱해야한다.

미리 감사드립니다. :).

+1

실제'request' 객체를 조롱하고 적절한'json'과'headers' 속성을 부여하십시오. –

+0

@AlexHall, 답장을 보내 주셔서 감사합니다. 만약 내가'요청 '객체 전체를 조롱한다면 나는 같은 속성을 모의해야한다. 좋은 옵션을 1-2의 속성을 조롱하는 방법이 있습니까? – Nilesh

+0

@AlexHall 나는'request = Mock (headers = { 'x': 'x'}, json = {})'을 시도했지만 실패합니다. : – Nilesh

답변

1

쉬운 대안, 병의 요청을 조롱하는, 함수에 주입 할 수 :

from bottle import request 

def abc(_request=None): 
    if _request is not None: 
     request = _request 

    x = request.get_header('x') 
    ... 
    ... 
    data = request.json() 
    ... 
    ... 

테스트 코드를 직접 가짜 요청 개체보기를 호출 수있는이 안전해야 당신의 프로덕션 코드는 조건부를 건너 뜁니다.

병을 사용 해본 적이 없으므로 이름이 지정된 params와 URL 경로가 어떻게 작동하는지 확신 할 수 없습니다.

+0

고마워,하지만 만약 내가 함수 서명을 바꾼다면 내 매니저에게 정당화해야한다. 왜? :(함수명을 변경하지 않고 모의 할 수있는 방법이 있습니까? – Nilesh

+0

'Read-Only Property'를 제공합니다. if self.read_only : raise AttributeError ("읽기 전용 속성.") AttributeError : 읽기 전용 속성. ' – Nilesh

+1

'bottle.py'로 쓰여진 방법은 읽기 전용 :( – Nilesh

1

병의 소스 코드를 확인, 헤더와 JSON 같은 있습니다 :

def test_xxx(monkeypatch): 
    monkeypatch.setitem(request.environ, 'bottle.request.json', {'name': 'xxx', 'version': '0.1'}) 
    add_xxx() 
    assert 
0

사용 Boddle https://github.com/keredson/boddle

을 내 pytest 경우에 따라서

@DictProperty('environ', 'bottle.request.headers', read_only=True) 
    def headers(self): 
     ''' A :class:`WSGIHeaderDict` that provides case-insensitive access to 
      HTTP request headers. ''' 
     return WSGIHeaderDict(self.environ) 

, 나는 다음과 같은 request.environ 패치

def test_abc(self, _, __): 
    with boddle(headers={'x':'x'}): 
     # tests