我想写一个单元测试,测试我的协调员类的功能发送数据到我嘲笑的生产者。我有点疯狂地添加打印语句来查看发生了什么,我不确定这是否有用,但我会包含这些内容。实际的模拟似乎是从查看打印语句开始的,但是我的assert_has_calls抛出了一个断言错误,指出找不到调用。我做错了什么?Python的assert_has_calls抛出AssertionError,发现调用没有
我使用Python 2.7.10和2.0.0模拟
这里是我的测试:
@mock.patch('mypackage.producer.Producer', autospec=True)
def test_send_data(self, mock_producer):
coor = mypackage.MyCoordinator()
# Make sure we initialized the mocked producer with no values
mock_producer.assert_called_with(None, None, None, None)
# Create some data and send it to the producer
for count in range(11):
jsonToSend = {"objectID": 'test{}'.format(count)}
coor.send_data(jsonToSend, None)
print 'Sent message %s' % (jsonToSend)
# Verify the producer was called
assert mock_producer.called is True
print '\nMethod Calls:'
print mock_producer.method_calls
print '\nCall Args List:'
print mock_producer.call_args_list
print mock_producer.send_message.call_args_list
print '\nAll Calls:'
print mock_producer.mock_calls
calls = [
mock.call().start(),
mock.call().send_message({"objectID": "test1"}, None),
mock.call().send_message({"objectID": "test2"}, None),
mock.call().send_message({"objectID": "test3"}, None)]
# Verify that the mocks have been called correctly
mock_producer.assert_has_calls(calls)
这里是输出:
Sent message {'objectID': 'test0'}
Sent message {'objectID': 'test1'}
Sent message {'objectID': 'test2'}
Sent message {'objectID': 'test3'}
Sent message {'objectID': 'test4'}
Sent message {'objectID': 'test5'}
Sent message {'objectID': 'test6'}
Sent message {'objectID': 'test7'}
Sent message {'objectID': 'test8'}
Sent message {'objectID': 'test9'}
Sent message {'objectID': 'test10'}
Method Calls:
[call().start(),
call().send_message({'objectID': 'test0'}, None),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None),
call().send_message({'objectID': 'test4'}, None),
call().send_message({'objectID': 'test5'}, None),
call().send_message({'objectID': 'test6'}, None),
call().send_message({'objectID': 'test7'}, None),
call().send_message({'objectID': 'test8'}, None),
call().send_message({'objectID': 'test9'}, None),
call().send_message({'objectID': 'test10'}, None)]
Call Args List:
[call(None, None, None, None)]
[]
All Calls:
[call(None, None, None, None),
call().start(),
call().send_message({'objectID': 'test0'}, None),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None),
call().send_message({'objectID': 'test4'}, None),
call().send_message({'objectID': 'test5'}, None),
call().send_message({'objectID': 'test6'}, None),
call().send_message({'objectID': 'test7'}, None),
call().send_message({'objectID': 'test8'}, None),
call().send_message({'objectID': 'test9'}, None),
call().send_message({'objectID': 'test10'}, None)]
======================================================================
FAIL: test_send_data (kafka_api_test.KafkaApiTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Anaconda2\lib\site-packages\mock\mock.py", line 1305, in patched
return func(*args, **keywargs)
File "C:/Users/myuser/workspace/MyProject/tests/my_test.py", line 76, in test_send_data
mock_producer.assert_has_calls(calls)
File "C:\Anaconda2\lib\site-packages\mock\mock.py", line 969, in assert_has_calls
), cause)
File "C:\Anaconda2\lib\site-packages\six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call().start(),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None)]
Actual: [call(None, None, None, None),
call().start(),
call().send_message({'objectID': 'test0'}, None),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None),
call().send_message({'objectID': 'test4'}, None),
call().send_message({'objectID': 'test5'}, None),
call().send_message({'objectID': 'test6'}, None),
call().send_message({'objectID': 'test7'}, None),
call().send_message({'objectID': 'test8'}, None),
call().send_message({'objectID': 'test9'}, None),
call().send_message({'objectID': 'test10'}, None)]
编辑:
只是为了看看会发生什么,我也试着改变断言状态彪mock_producer.assert_has_calls(mock_producer.mock_calls)
但失败,出现错误:
Traceback (most recent call last):
File "C:\Anaconda2\lib\site-packages\mock\mock.py", line 1305, in patched
return func(*args, **keywargs)
File "C:/Users/myuser/workspace/MyProject/tests/my_test.py", line 73, in test_send_data
mock_producer.assert_has_calls(mock_producer.mock_calls)
File "C:\Anaconda2\lib\site-packages\mock\mock.py", line 969, in assert_has_calls
), cause)
File "C:\Anaconda2\lib\site-packages\six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call(None, None, None, None),
call().start(),
call().send_message({'objectID': 'test0'}, None),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None),
call().send_message({'objectID': 'test4'}, None),
call().send_message({'objectID': 'test5'}, None),
call().send_message({'objectID': 'test6'}, None),
call().send_message({'objectID': 'test7'}, None),
call().send_message({'objectID': 'test8'}, None),
call().send_message({'objectID': 'test9'}, None),
call().send_message({'objectID': 'test10'}, None),
call().send_message({'objectID': 'test11'}, 'done')]
Actual: [call(None, None, None, None),
call().start(),
call().send_message({'objectID': 'test0'}, None),
call().send_message({'objectID': 'test1'}, None),
call().send_message({'objectID': 'test2'}, None),
call().send_message({'objectID': 'test3'}, None),
call().send_message({'objectID': 'test4'}, None),
call().send_message({'objectID': 'test5'}, None),
call().send_message({'objectID': 'test6'}, None),
call().send_message({'objectID': 'test7'}, None),
call().send_message({'objectID': 'test8'}, None),
call().send_message({'objectID': 'test9'}, None),
call().send_message({'objectID': 'test10'}, None),
call().send_message({'objectID': 'test11'}, 'done')]
基于模拟的文档,我倒是觉得应该成功,因为assert_has_calls预期值与那些在mock_calls列表进行比较。那个逻辑不正确?
您在测试具有的期望是错误的。您只有一个Mock对象,所以当您断言这些调用时,您需要对该Mock对象进行的所有调用。这就是错误信息告诉你的 - 你预期的呼叫清单与你实际的呼叫清单不匹配。例如,您期望的调用列表中没有初始'call(None,None,None,None)'。 –
@MaxShepherd我试着改变预期调用mock.call(None,None,None,None).start()到期望的调用列表的开头,或者将预期的调用改为mock.call(None,None,无,无).send_message(...)但我得到了两个相同的断言错误。你是否建议我改变别的东西? – jencoston