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")
我正在尝试为内部使用它的一个对象模拟流 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")