由于我们从代码提出的请求中返回了模拟对象,因此这意味着,无论对被测代码的输入是什么,只要正确处理了请求的响应,测试就始终会通过。但是,我们不知道代码是否首先对我的网站提出了正确的请求。例如,如果makeRequest()
由于某种原因向www.my-site.com/foobar
或www.google.com
发出请求,我们将得到误报,因为测试仍然可以通过,因为模拟响应仍然是我们期望的结果,但是他们应该真的失败。
可能是一个愚蠢的问题,但是unittest.mock中是否可以检查并确保发出的请求也符合我们的期望?
def makeRequest(session):
resp = session.get(www.my-site.com/foobar)
return resp
@patch.object(requests.Session, 'get')
def test_makeRequest(self, mock_get):
def mockResp(self):
r = requests.Response()
req.status_code = 200
return r
mock_get.return_value = mockResp()
mock_get_response = makeRequest()
答案 0 :(得分:1)
您可以通过使用模拟中的断言来检查请求参数。
# setting up the canned response on the mock
mock_get.return_value = mockResp()
# actually calls the real code under test, i.e. calls makeRequest
mock_get_response = makeRequest()
# make an assertion about what the code *within* makeRequest did
mock_get.assert_called_once_with("www.my-site.com/foobar")
# maybe make an assertion about the `mock_get_response` here, too
请注意,按照书面规定,该测试将失败。您需要将会话传递到makeRequest
,因为它需要一个必填参数。与其在requests.Session
上设置模拟,不如在测试过程中将模拟作为会话参数传递,将更加容易。