17

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

import requests
session = requests.session()

我怎么能用它来模拟它Mock?这种操作有装饰器吗?我试过以下:

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

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

4

4 回答 4

13

由于 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'   
于 2018-03-21T13:11:49.293 回答
6

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

于 2013-06-25T16:49:55.720 回答
1

从先前的答案中得到一些启发,并且:

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
于 2014-07-14T08:48:46.363 回答
0

我发现了 requests_mock 库。它为我省去了很多麻烦。使用 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。

于 2020-06-22T06:51:29.130 回答