【问题标题】:mocking session in requests library请求库中的模拟会话
【发布时间】:2013-06-20 20:05:12
【问题描述】:

在我的 python 代码中,我有全局 requests.session 实例:

import requests
session = requests.session()

如何使用Mock 模拟它?这种操作有装饰器吗?我尝试了以下操作:

session.get = mock.Mock(side_effect=self.side_effects)

但是(如预期的那样)此代码不会在每次测试后将 session.get 返回到原始状态,就像 @mock.patch 装饰器那样。

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    由于requests.session()返回的是Session类的实例,所以也可以使用patch.object()

    from requests import Session
    from unittest.mock import patch
    
    @patch.object(Session, 'get')
    def test_foo(mock_get):
        mock_get.return_value = 'bar'   
    

    【讨论】:

    • 帮了我大忙。允许我使用 http = requests.Session()
    • 它救了我!完美。
    【解决方案2】:

    使用mock.patch 修补模块中的会话。给你,一个完整的工作示例https://gist.github.com/k-bx/5861641

    【讨论】:

    • 添加缩进。此代码不可读,也不会修补会话。
    • @amezhenin 从 gist 评估代码。这段代码有效,它修补了会话。
    • 你能让会话全球化吗?
    【解决方案3】:

    从上一个答案中得到一些启发:

    mock-attributes-in-python-mock

    我能够模拟这样定义的会话:

    class MyClient(object):
        """
        """
        def __init__(self):
            self.session = requests.session()
    

    这样:(对 get 的调用返回一个将 status_code 属性设置为 200 的响应)

    def test_login_session():
        with mock.patch('path.to.requests.session') as patched_session:
            # instantiate service: Arrange
            test_client = MyClient()
            type(patched_session().get.return_value).status_code = mock.PropertyMock(return_value=200)
    
            # Act (+assert)
            resp = test_client.login_cookie()
    
            # Assert
            assert resp is None
    

    【讨论】:

      【解决方案4】:

      我发现了the requests_mock library。它为我省去了很多麻烦。用 pytest...

      def test_success(self, requests_mock):
          """They give us a token.
          """
          requests_mock.get("https://example.com/api/v1/login", 
              text=(
                '{"result":1001, "errMsg":null,'
                f'"token":"TEST_TOKEN",' '"expire":1799}'))
      
          auth_token = the_module_I_am_testing.BearerAuth('test_apikey')
      
          assert auth_token == 'TEST_TOKEN'
      

      我正在测试的模块有我的BearerAuth 类,它会命中一个端点以获取令牌以启动 requests.session。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        相关资源
        最近更新 更多