猴子修补request.get()函数

时间:2020-03-30 21:11:51

标签: python unit-testing pytest

到目前为止,我正在测试我的代码。但是现在我必须使用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()来“模拟” requests.get()的答案,它怎么可能是一个“ str”对象?寻找self.r的类型,我得到<class 'requests.models.Response'>

1 个答案:

答案 0 :(得分:0)

使模仿类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