Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟请求。会话。获取_Python_Django_Mocking - Fatal编程技术网

Python 模拟请求。会话。获取

Python 模拟请求。会话。获取,python,django,mocking,Python,Django,Mocking,我有一个新的管理命令,它从url获取csv并将其保存在本地,然后对其执行一些操作并将其删除。这里是我在“下载代码”中检索它的地方: 对于真正的url来说,它工作得很好,而且一切都很顺利。我编写了两个单元测试来调用我的管理命令,它们正在工作,但现在我添加了一个单元测试来使用模拟响应,而不是点击实时url。我正在这样尝试,我希望用发生的事情来代替请求。Session.get): 但是我调用url时得到的响应与我试图模拟的响应之间有些不同: 使用url的测试工作正常,但此模拟测试在csv期间失败。请

我有一个新的管理命令,它从url获取csv并将其保存在本地,然后对其执行一些操作并将其删除。这里是我在“下载代码”中检索它的地方:

对于真正的url来说,它工作得很好,而且一切都很顺利。我编写了两个单元测试来调用我的管理命令,它们正在工作,但现在我添加了一个单元测试来使用模拟响应,而不是点击实时url。我正在这样尝试,我希望用发生的事情来代替请求。Session.get):

但是我调用url时得到的响应与我试图模拟的响应之间有些不同

  • 使用url的测试工作正常,但此模拟测试在csv期间失败。请使用以下命令写入:“AttributeError:‘dict’对象没有属性‘content’”
  • 但是,当我使用“subscriptable”表示法时,我可以从测试内部看到内容:mock_response.return_value['content'])
  • 如果我试图更新我的“下载代码”以使用csv.write(download.meta['content']),我会得到一个TypeError:'Response'对象不可订阅,mock:keyrerror:'meta'

我觉得一段代码的格式与其他需要的稍有不同,但我不确定如何修复它-丢失的链接在哪里?

您可以将对象作为
测试响应传递,而不是传递
dict
。如下图所示

@patch('requests.Session.get')
def test_mock_pass(self, mock_response):
    """ Test using mock response """
    
    class TestResponse:
        def __init__(self, **kwargs):
            self.__dict__ = kwargs

    test_response = TestResponse(**{
        'content': 'bunch_of_content_here',
        'status_code': 200,
        'encoding': 'ISO-8859-1',
        'reason': 'OK',
        'elapsed': 'OK'
    })

    mock_response.return_value = test_response
    print("mock_response.return_value['content'] has: ", mock_response.return_value.content)

    try:
        call_command('download_fallback_csv')
    except CommandError as e:
        self.fail("Failed download csv. {}".format(e))
这样,您就不必更改管理命令中的代码

@patch('requests.Session.get')
def test_mock_pass(self, mock_response):
    """ Test using mock response """
        
    test_response = {
        'content': 'bunch_of_content_here'
        'status_code': 200,
        'encoding': 'ISO-8859-1',
        'reason': 'OK',
        'elapsed': 'OK'
    }

    mock_response.return_value = test_response
    print("mock_response.return_value['content'] has: ", mock_response.return_value['content'])

    try:
        call_command('download_fallback_csv')
    except CommandError as e:
        self.fail("Failed download csv. {}".format(e))
@patch('requests.Session.get')
def test_mock_pass(self, mock_response):
    """ Test using mock response """
    
    class TestResponse:
        def __init__(self, **kwargs):
            self.__dict__ = kwargs

    test_response = TestResponse(**{
        'content': 'bunch_of_content_here',
        'status_code': 200,
        'encoding': 'ISO-8859-1',
        'reason': 'OK',
        'elapsed': 'OK'
    })

    mock_response.return_value = test_response
    print("mock_response.return_value['content'] has: ", mock_response.return_value.content)

    try:
        call_command('download_fallback_csv')
    except CommandError as e:
        self.fail("Failed download csv. {}".format(e))