代码之家  ›  专栏  ›  技术社区  ›  and

Python模拟-请求。Session()获取请求断言错误,未接听调用

  •  3
  • and  · 技术社区  · 5 月前

    我在测试基础 GET 根据 requests 模块。我在用 requests.Session 创建一个会话实例,稍后将其传递给函数。

    我在嘲笑函数调用。我已经修补了 session.get 在函数内调用,但我得到以下错误:

    断言错误:get('https://example-name/v1/0001')未找到呼叫

    我假设我没有正确修补位置,但我不确定我具体哪里出了问题。

    main.py

    import requests
    
    base_url = "https://example-name/v1/"
    
    session = requests.Session()
    
    def fetch_data_with_session(session, base_url, endpoint):
        response = session.get(base_url + endpoint)  
        return response.json()
    

    test_main.py

    import unittest
    from requests import Session
    from main import fetch_data_with_session
    from unittest.mock import Mock, patch
    
    
    class TestingGet(unittest.TestCase):
        
        @patch.object(Session, 'get')
        def test_fetch(self, mock_get):
            data = {
                    "id": "0001",
                    "name": "John Doe",
                    }
            mock_response = Mock()
            mock_response.json.return_value = data
            
            mock_get.return_value = mock_response
            
            mock_session = Mock()
            
            retrieved_get_data = fetch_data_with_session(mock_session, "https://example-name/v1/", "0001")
            
            mock_get.assert_any_call("https://example-name/v1/0001")
            
            self.assertEqual = (outages_data, data)
    
    if __name__ == '__main__':
        unittest.main()
    

    我也试着用 mock.get.assert_called_with 并得到了类似的错误。

    assert_called_with
        raise AssertionError(error_message)
    AssertionError: expected call not found.
    Expected: get('https://example-name/v1/0001')
    Actual: not called.
    

    同样,我假设我没有正确修补GET调用,但不确定如何纠正它。

    编辑:谢谢@Guy提供的答案。更新的模块代码如下。请查看@Guy的回答以获取解释

    @patch.object(requests.Session, 'get')
    def test_fetch(self, mock_get):
        data = {
                "id": "exampleID",
                "name": "example",
                "devices": [
                    {
                    "id": "0001",
                    "name": "Device A"
                    }
                ]
                }
        mock_response = Mock()
        mock_response.json.return_value = data
        
        mock_get.return_value = mock_response
        
        outages_data = fetch_data_with_session(mock_get, "https://example-name/v1/", "0001")
        
        mock_get.get.assert_called_with("https://example-name/v1/0001")
        
        self.assertEqual = (outages_data, data)
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   Guy    5 月前

    你的代码中有两个问题

    1. 你使用 mock_session 用于API调用但进行测试 mock_get 为了它

    2. mock_get 模拟会话 session.get 功能,不是 Session 例子

    有两个选项的简化测试

    @patch.object(Session, 'get')
    def test_fetch(self, mock_get):
    
        fetch_data_with_session(mock_get, "https://example-name/v1/", "0001")
        mock_get.assert_any_call("https://example-name/v1/0001")
    
        # or
    
        mock_session = Mock()
        fetch_data_with_session(mock_session, "https://example-name/v1/", "0001")
        mock_session.assert_any_call("https://example-name/v1/0001")
    

    main.py

    def fetch_data_with_session(get, base_url, endpoint):
        response = get(base_url + endpoint)
        return response.json()