我正在使用requests-mock和pytest来促进我的库的单元测试,该库使用requests进行API调用。
除了模拟服务器响应之外,我经常需要验证我的库是否在HTTP主体中发送了预期的有效负载。
我能够在我的测试中使用additional_matcher回调间接执行此操作:
def mylibrary_foo():
"""Library method that is under test."""
r = requests.post('http://example.com/foo', data='hellxo')
return r.text
@requests_mock.Mocker()
def test_foo(m):
def matcher(request):
assert request.body == 'hello'
return True
m.post('http://example.com/foo', text='bar', additional_matcher=matcher)
result = mylibrary_foo()
assert result == 'bar'
但是使用additional_matcher
回调来验证请求格式感觉有点好笑,因为它实际上是要确定是否应该嘲笑这个特定的请求调用。如果我没有使用请求 - 模拟,似乎我会做更像的事情:
def test_foo():
# setup api_mock here...
mylibrary_foo()
api_mock.assert_called_with(data='hello')
是否有一种常用于请求模拟的模式来支持HTTP请求验证?
答案 0 :(得分:4)
我还没有找到任何模式来验证请求是否被调用,参数是什么,但我所做的可能更适合你
def test_foo(m):
...
adapter = m.post('http://example.com/foo', text='bar')
result = mylibrary_foo()
# for `called` or `call_count`
assert adapter.call_count == 1
assert adapter.called
# for more in-depth checking of params/body, you can access `.last_request` and `.request_history` of `adapter`
assert adapter.last_request.json() == {'foo': 'bar'}
assert adapter.request_history[-1].json() == {'foo': 'bar'}