requesocks:模拟会话对象的 get() 方法
requesocks: Mocking the session objects' get() method
我正在使用 Python 包 requesocks
而不是 requests
因为它支持使用 SOCKS 代理。
我正在尝试使用 Python 的内置模拟库模拟 session
对象的 get()
方法,但我无法模拟状态代码:
import mock
import requesocks
class WebScraper:
def get_content(self, url, proxy):
session = requesocks.session()
session.proxies = proxy
response = session.get(url)
return response.status_code
def main():
session = requesocks.session()
session.get = mock.MagicMock(return_value={'status_code': 400})
scraper = WebScraper()
proxy = {'http': 'socks5://localhost:1080'}
status_code = scraper.get_content('http://www.purple.com', proxy)
print "Status Code: ", status_code
if __name__ == "__main__":
main()
运行 这个人为的例子导致以下输出:
$ python test_mock.py
Status Code: 200
模拟这个的正确方法是什么,以便我得到 400
的状态代码?
此外,requesocks
是否有类似 requests-mock
的模拟库?
我通过调整 this answer 中的解决方案使其工作。希望这可以帮助其他人,这是我更新的代码:
import mock
import requesocks
class WebScraper:
def get_content(self, url, proxy):
session = requesocks.session()
session.proxies = proxy
response = session.get(url)
return response.status_code
@mock.patch('requesocks.session')
def main(mock_class):
instance = mock_class.return_value
type(instance.get.return_value).status_code = mock.PropertyMock(return_value=400)
scraper = WebScraper()
proxy = {'http': 'socks5://localhost:1080'}
status_code = scraper.get_content('http://www.purple.com', proxy)
print "Status Code: ", status_code
if __name__ == "__main__":
main()
这会产生所需的输出:
$ python test_mock.py
Status Code: 400
我正在使用 Python 包 requesocks
而不是 requests
因为它支持使用 SOCKS 代理。
我正在尝试使用 Python 的内置模拟库模拟 session
对象的 get()
方法,但我无法模拟状态代码:
import mock
import requesocks
class WebScraper:
def get_content(self, url, proxy):
session = requesocks.session()
session.proxies = proxy
response = session.get(url)
return response.status_code
def main():
session = requesocks.session()
session.get = mock.MagicMock(return_value={'status_code': 400})
scraper = WebScraper()
proxy = {'http': 'socks5://localhost:1080'}
status_code = scraper.get_content('http://www.purple.com', proxy)
print "Status Code: ", status_code
if __name__ == "__main__":
main()
运行 这个人为的例子导致以下输出:
$ python test_mock.py
Status Code: 200
模拟这个的正确方法是什么,以便我得到 400
的状态代码?
此外,requesocks
是否有类似 requests-mock
的模拟库?
我通过调整 this answer 中的解决方案使其工作。希望这可以帮助其他人,这是我更新的代码:
import mock
import requesocks
class WebScraper:
def get_content(self, url, proxy):
session = requesocks.session()
session.proxies = proxy
response = session.get(url)
return response.status_code
@mock.patch('requesocks.session')
def main(mock_class):
instance = mock_class.return_value
type(instance.get.return_value).status_code = mock.PropertyMock(return_value=400)
scraper = WebScraper()
proxy = {'http': 'socks5://localhost:1080'}
status_code = scraper.get_content('http://www.purple.com', proxy)
print "Status Code: ", status_code
if __name__ == "__main__":
main()
这会产生所需的输出:
$ python test_mock.py
Status Code: 400