Monkeypatching функцию request.get () - PullRequest
0 голосов
/ 31 марта 2020

Я тестирую свой код, пока все хорошо. Но теперь мне нужно протестировать функцию, используя request.get () для вызова API. Насколько я понимаю, я должен «смоделировать» эту функцию в моем тесте.

Моя функция вызывает Google Maps API, и в своем тесте я добавил желаемый результат:

     result = 

            {
                    "candidates":[
                        {
                            "geometry":{
                                "location":{
                                "lat":-34.5453062,
                                "lng":-58.44977489999999
                                }
                                },
                             "name":"Stade Monumental Antonio Vespucio Liberti",
                             "place_id":"ChIJ340B5jq0vJURijD6W6dgfz0"
                        }
                                ]
             }

    return json.dumps(result)

Эта функция, которую я тестирую:

def get_lat_lng (self):
        self.input_api = '%20'.join(self.parsed_question)
        self.input_api = ' '.join(self.parsed_question)
        self.google_api_url = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input={}&inputtype=textquery&fields=geometry,name,place_id&types=point_of_interest&key={}'.format (self.input_api, api_key)     
        self.r = requests.get (url = self.google_api_url)        
        self.data = self.r.json()                    
        self.name = self.data['candidates'][0]['name']       
        self.place_id = self.data['candidates'][0]['place_id']              
        self.lat = self.data['candidates'][0]['geometry']['location']['lat']        
        self.lng = self.data['candidates'][0]['geometry']['location']['lng']                
        return (self.lat, self.lng, self.place_id)

И мой тест пока:

def test_get_lat_lng (monkeypatch):    

    monkeypatch.setattr('requests.get', mock_get_lat_lng)

Это код ошибки, который я получаю при попытке запустить тест:

 self.r = requests.get (url = self.google_api_url)
>       self.data = self.r.json()
E       AttributeError: 'str' object has no attribute 'json'

Я не понимаю, так как я использую json .dumps () на желаемом выводе, чтобы «смоделировать» ответ из request.get (), как это может быть объект 'str'? Ищу тип self.r получаю <class 'requests.models.Response'>.

1 Ответ

0 голосов
/ 02 апреля 2020

Создание mock_get_lat_lng () класса сделало свое дело. Вот мой последний рабочий тест:

class mock_get_lat_lng():

    def __init__(self, url):
        pass

    def json(self):
        result = {
                "candidates": [
                    {
                        "geometry": {
                            "location": {
                                "lat": -34.5453062,
                                "lng": -58.44977489
                            }
                        },
                        "name": "Stade Monumental Antonio Vespucio Liberti",
                        "place_id": "ChIJ340B5jq0vJURijD6W6dgfz0"
                    }
                ]
                }
        return result
...