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