Python 嘲笑 requests.get 内容和 iter_lines()

Python mocking requests.get content and iter_lines()

我正在尝试为内部使用它的一个对象模拟流 requests.get 函数。

我特别需要测试以下方法:

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

我需要 requests.get 来 return 我像 "abc\n123"

然后我的测试方法应该是这样的:

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

我正在尝试实现 mocked_requests_get,但遗憾的是我无法实现它。可以这样使用模拟库吗? mocked_requests_get 应该是什么样子?

更新。如果没有完整的示例,就不能说您的代码真正出了什么问题。我如何使用 responses 模块解决此问题:

import requests
import unittest
import responses


class Foo(object):
    def __init__(self, uri):
        self.uri = uri

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


class TestFoo(unittest.TestCase):
    @responses.activate
    def test_iter_lines(self):
        responses.add(responses.GET, "http://local.host/", body='abc\n123')
        r = iter(Foo("local.host"))
        self.assertEqual(r.next(), "abc")
        self.assertEqual(r.next(), "123")

if __name__ == '__main__':
    unittest.main()

P.S。也许你想在调用之前 return 迭代器?

self.assertEqual(object.next(), "123")