2016-06-10 34 views
1

我正在使用框架。我有這樣的代碼在Python中模擬bottle.request對象

from bottle import request 

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

我寫UT的這個功能,我想嘲笑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

@AlexHallI嘗試過'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() 
    ... 
    ... 

這應該是安全的,因爲你的測試代碼可以用一個假的請求對象直接打電話給你的看法和你生產代碼將跳過條件。

我不知道如何使用具有命名參數的URL路由,因爲我從來沒有用過瓶子。

+0

感謝,但如果我改變功能簽名,我必須向我的經理證明,爲什麼我改變:(有沒有辦法模擬而不改變功能簽名? – Nilesh

+0

它給出了「只讀屬性」,這裏是錯誤跟蹤'如果self.read_only:raise AttributeError(「只讀屬性」。) AttributeError:只讀屬性.' – Nilesh

+1

它以'bottle.py'這樣寫的方式,它的只讀:( – Nilesh

1

檢查瓶的源代碼,頭和JSON是這樣的:

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

所以在我pytest情況下,我修補request.environ象下面這樣:

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