我是模拟库的新手,到目前为止,它一直给我带来麻烦。我正在尝试测试一个URL解析方法,该方法从initialUrl
获取响应,然后在该方法中对其进行解析。我设置了autospec=true
,所以我认为它应该可以访问请求库中的所有方法(包括response.url
),尽管我试图模拟get
和response
我不确定这是否需要吗?
我的getUrl方法,它获取响应并返回其解析的内容:
def getUrl(response):
if response.history:
destination = urllib.parse.urlsplit(response.url)
baseUrlTuple = destination._replace(path="", query="")
return urllib.parse.urldefrag(urllib.parse.urlunsplit(baseUrlTuple)).url
raise RuntimeError("No redirect")
测试方法:
def testGetUrl(self):
initialUrl = 'http://www.initial-url.com'
expectedUrl = 'http://www.some-new-url.com'
mock_response = Mock(spec=requests, autospec=True)
mock_response.status_code = 200
mock_get = Mock(return_value=mock_response)
#mock_get.return_value.history = True
resp = mock_get(self.initialUrl)
mock_response.history = True
resultUrl = getBaseUrl(resp)
self.assertEqual(resultUrl, expectedUrl)
运行测试时,我得到
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'url'
答案 0 :(得分:0)
首先,我将修复您问题中的代码,以使其实际运行。
您有几种选择,最简单的方法是将url
添加到您要嘲笑的属性列表中:
mock_response.url = <your URL>
但是,如果您希望自动生成url属性,则应该使用requests.Response()
时,要理解您正在尝试使用请求库作为模拟的规范也很重要。不过,您仍然必须为其分配任何要使用的url,否则您将把Mock对象与函数中的int进行比较。
如果要了解更多信息,请查看涉及规范的文档: https://docs.python.org/3/library/unittest.mock-examples.html