Saš*_*aba 2 python unit-testing mocking
我有多次调用同一个模拟器,我想检查每个调用参数和调用它的顺序.
例如,如果我需要检查最后一个电话,我会使用这个:
mock.assert_called_once_with(
'GET',
'https://www.foobar.com',
params=OrderedDict([
('email', 'email'),
]),
headers=None,
data=None)
Run Code Online (Sandbox Code Playgroud)
但是我想为每次通话都这样做.
我设法做到了,像这样:
mycode.py
from requests import Session
class Foo(object):
def req(method, url, data, params=None, headers=None):
self.session = Session()
r = self.session.request(method, url, data=data, params=params, headers=headers)
return r
Run Code Online (Sandbox Code Playgroud)
test_mycode.py
@patch('myapp.mycode.Session')
def test_foobar(self, Session):
# Set mock.
self.request_mock = Session.return_value.request
self.request_mock.return_value = MagicMock()
data = {'foo': 'bar'}
f = Foo()
f.req('POST', 'https://www.foobar.com/', data=data)
f.req('GET', 'https://www.foobar.com/', data=None)
self.assertEqual(self.request_mock.call_count, 2)
call1 = self.request_mock._mock_call_args_list[0]
call2 = self.request_mock._mock_call_args_list[1]
call_params = (
('POST', 'https://www.foobar.com'),
{
'headers': None,
'allow_redirects': False,
'params': None,
'data': json.dumps(data)
}
)
self.assertEqual(tuple(call1), call_params)
call_params = (
('GET', 'https://www.foobar.com'),
{
'headers': None,
'allow_redirects': False,
'params': None,
'data': None
}
)
self.assertEqual(tuple(call2), call_params)
Run Code Online (Sandbox Code Playgroud)
这有效,但我对调用参数的assertEqual方法有点担心.我觉得这样做有更好的方法.我还是很嘲笑,所以任何建议都会受到赞赏.
您可能想要使用该Mock.assert_has_calls方法.
self.assertEqual(self.request_mock.call_count, 2)
self.request_mock.assert_has_calls([
mock.call(
'POST',
'https://www.foobar.com',
headers=None,
allow_redirects=False,
params=None,
data=json.dumps(data)),
mock.call(
'GET',
'https://www.foobar.com',
headers=None,
allow_redirects=False,
params=None,
data=None)
])
Run Code Online (Sandbox Code Playgroud)
默认情况下,assert_has_calls将检查调用是否按正确的顺序发生.如果您不关心订单,可以使用any_order关键字参数(设置为True).