2016-06-10 2 views
1

Я использую рамки. У меня есть код, какMock bottle.request объект в python

from bottle import request 

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

Я пишу союзные для этой функции, я хочу, чтобы дразнить get_header и json из bottle.request, и вернуть мои ложные данные от этого.

Я пробовал.

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, Спасибо за ответ. Если я издеваюсь над целым объектом 'request', тогда я должен издеваться над многими атрибутами. Есть ли способ высмеять только 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

дает свойство Read-Only'. if 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 
Смежные вопросы