jeudi 20 août 2015

Python mocking requests.get content and iter_lines()

I am trying to mock the streamed requests.get function for one object that uses it internally.

I particularly need to test following methods:

class MyObject(object)
    def __iter__(self):
        payload = {"op": "OPEN"}
        response = requests.get("http://" + self.parsed_uri.uri_path, params=payload, stream=True)
        return response.iter_lines()

    def read(self, size=None):
        if not size or size < 0:
            payload = {"op": "OPEN", "offset": self.offset}
            self.offset = 0
        else:
            payload = {"op": "OPEN", "offset": self.offset, "length": size}
            self.offset = self.offset + size
        response = requests.get("http://" + self.parsed_uri.uri_path, params=payload, stream=True)
        return response.content

I need requests.get to return me something like "abc\n123"

And then my test method should look like:

@mock.patch('requests.get', mock.Mock(side_effect=mocked_requests_get))
def test_iter(self, mock_get):
    object = MyObject(ParseUri("http://host/path"))
    self.assertEqual(object.next(), "abc")
    self.assertEqual(object.next(), "123")

@mock.patch('requests.get', mock.Mock(side_effect=mocked_requests_get))
def test_read(self, mock_get):
    object = MyObject(ParseUri("http://host/path"))
    self.assertEqual(object.read, "abc\n123")

I am trying to implement the mocked_requests_get, but unfortunately I can't make it work. Is it possible to use mock library this way? How should the mocked_requests_get look like?

Aucun commentaire:

Enregistrer un commentaire