2016-06-10 14 views
1

Ich verwende Rahmen. Ich habe Code wieMock bottle.request Objekt in Python

from bottle import request 

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

I UTs für diese Funktion schreibe, möchte ich get_header und json von bottle.request verspotten, und kehren meine Mock Daten aus, dass.

Ich versuchte es.

from mock import patch 

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

Aber es gibt Fehler für request.headers ist schreibgeschützt. Ich muss auch request.json vortäuschen.

Danke für Hilfe im Voraus :).

+1

Verspotten Sie das eigentliche 'request' Objekt und geben Sie ihm die entsprechenden' json' und 'header' Attribute. –

+0

@AlexHall, Danke für die Antwort. Wenn ich das gesamte "Anfrage" -Objekt verspotze, dann muss ich viele Attribute derselben vortäuschen. Gibt es eine Möglichkeit, nur 1-2 Attribut zu verspotten, dann ist es eine gute Option. – Nilesh

+0

@AlexHallI versuchte 'request = Mock (headers = {'x': 'x'}, json = {})' aber es schlägt fehl. :( – Nilesh

Antwort

1

Eine einfache Alternative, eine Flasche Anfrage zu verspotten, könnte es in Ihrer Funktion zu injizieren:

from bottle import request 

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

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

Dieses sicher sein sollte als der Code Test Ihrer Ansicht nach mit einem gefälschten Request-Objekt direkt anrufen und Ihre Der Produktionscode überspringt die Bedingung.

Ich bin mir nicht sicher, wie das mit URL-Routen mit benannten Parametern funktioniert, wie ich nie Flasche verwendet habe.

+0

danke, aber wenn ich Funktionssignatur ändern, muss ich zu meinem Manager rechtfertigen, warum ich geändert habe :(. Gibt es eine Möglichkeit zu mocksen, ohne Funktionssignatur zu ändern? – Nilesh

+0

gibt es 'Read-Only-Eigenschaft'. Hier ist Fehler-Trace ' if self.read_only: raise AttributeError ("Schreibgeschützte Eigenschaft.") AttributeError: Schreibgeschützte Eigenschaft.' – Nilesh

+1

Es ist in 'bottle.py' geschrieben, so dass es nur gelesen wird :( – Nilesh

1

Überprüfen Sie den Quellcode der Flasche, Kopf- und json wie sind:

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

Also in meinem pytest Fällen gepatcht ich request.environ wie unten:

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