模拟请求/响应,模拟对象没有属性“ url”

时间:2019-10-14 23:27:44

标签: python unit-testing mocking python-mock

我是模拟库的新手,到目前为止,它一直给我带来麻烦。我正在尝试测试一个URL解析方法,该方法从initialUrl获取响应,然后在该方法中对其进行解析。我设置了autospec=true,所以我认为它应该可以访问请求库中的所有方法(包括response.url),尽管我试图模拟getresponse我不确定这是否需要吗?

我的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'

1 个答案:

答案 0 :(得分:0)

首先,我将修复您问题中的代码,以使其实际运行。

您有几种选择,最简单的方法是将url添加到您要嘲笑的属性列表中:

mock_response.url = <your URL>

但是,如果您希望自动生成url属性,则应该使用requests.Response()时,要理解您正在尝试使用请求库作为模拟的规范也很重要。不过,您仍然必须为其分配任何要使用的url,否则您将把Mock对象与函数中的int进行比较。

如果要了解更多信息,请查看涉及规范的文档: https://docs.python.org/3/library/unittest.mock-examples.html