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