2017-04-12 20 views
0

我想写一个单元测试,测试我的协调员类的功能发送数据到我嘲笑的生产者。我有点疯狂地添加打印语句来查看发生了什么,我不确定这是否有用,但我会包含这些内容。实际的模拟似乎是从查看打印语句开始的,但是我的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列表进行比较。那个逻辑不正确?

+0

您在测试具有的期望是错误的。您只有一个Mock对象,所以当您断言这些调用时,您需要对该Mock对象进行的所有调用。这就是错误信息告诉你的 - 你预期的呼叫清单与你实际的呼叫清单不匹配。例如,您期望的调用列表中没有初始'call(None,None,None,None)'。 –

+0

@MaxShepherd我试着改变预期调用mock.call(None,None,None,None).start()到期望的调用列表的开头,或者将预期的调用改为mock.call(None,None,无,无).send_message(...)但我得到了两个相同的断言错误。你是否建议我改变别的东西? – jencoston

回答

0

因此,事实证明,因为我正在调用我在课堂上创建的生产者对象,所以我正在测试这些模拟被记录在第二个模拟对象下。我得到了其中两个:测试类中的一个mock_producer和称为myproducer的第二个模拟生产者(我在测试中使用的名称)。

@mock.patch('mypackage.mycoordinator.producer.Producer') # This creates the first mocked object 
@mock.patch('mypackage.mycoordinator.consumer.Consumer') 
def test_send_data(self, mock_consumer, mock_producer): 

class MyCoordinator(): 

def __init__(self): 
    # Initialize the producer 
    self.myproducer = producer.Producer(...) # This creates a second mocked object called myproducer 

# Send the data to the producer 
def send_data(self, data_to_send, key): 
    self.myproducer.send_message(data_to_send, key) 

所以,如果我改变为参照第二嘲笑生产者,而不是语句,我测试通过。例如:

assert coor.myproducer.send_message.called is True 

,而不是

assert mock_producer.called is True 
相关问题