![](/img/trans.png)
[英]Python MagicMock assert_called_once_with not taking into account arguments?
[英]Python 3.6 Beginner: Why getting a blank AssertionError for assert_called_once_with (unit test & mocking)
嗨,我是Python的新手,我正在嘗試運行以下模擬單元測試。 任何幫助將不勝感激,在此先感謝您!
我有一個LeadsConsumer類(Leadsconsumer模塊的類),我想對其方法_process_lead進行單元測試。
from .helper import dynamo_helpers
class LeadsConsumer:
def __init__(self):
self._dynamodb = dynamo_helpers.Dynamo(AWS_RUNTIME_REGION, ENVIRONMENT, VERTICAL)
def _process_lead(self, _lead):
role_set = self._dynamodb.get_role_set(_lead.getPartner_id())
if role_set is None:
role_set = self._dynamodb.create_partner(_lead)
if role_set['is-partner'] is True:
return
user = self._dynamodb.get_user(_lead.getEmail())
if user is None:
user = self._dynamodb.create_user(_lead)
else:
user = self._dynamodb.update_user(_lead)
單元測試如下所示:
class LeadsConsumerTest(TestCase):
@mock.patch('src.leads_consumer.dynamo_helpers.Dynamo')
def test_process_lead_new_lead(self, mock_dynamo_class):
# given
mock_dynamo_instance = mock_dynamo_class.return_value
mock_dynamo_instance.get_role_set.return_value = None
mock_dynamo_instance.create_partner.return_value = self._given_role_set(False)
mock_dynamo_instance.get_user.return_value = None
mock_dynamo_instance.create_user.return_value = None
_leads_consumer = LeadsConsumer()
_lead = self._given_lead(False)
# when
_leads_consumer._process_lead(_lead)
# then
assert mock_dynamo_instance.get_role_set.assert_called_once_with(_lead.getPartner_id())
assert mock_dynamo_instance.create_partner.assert_called_once()
assert mock_dynamo_instance.get_user.assert_called_once()
assert mock_dynamo_instance.create_user.assert_called_once_with(_lead)
當我運行此測試時,我得到以下AssertionError:
in test_process_lead_new_lead
assert mock_dynamo_instance.get_role_set.assert_called_once_with(_lead.getPartner_id())
AssertionError
空白的AssertionError(未對錯誤做任何解釋)使我感到困惑。 如果我改變
assert mock_dynamo_instance.get_role_set.assert_called_once_with(_lead.getPartner_id())
至
assert mock_dynamo_instance.get_role_set.assert_called_once_with("foobar", _lead.getPartner_id())
我懂了
AssertionError: Expected call: get_role_set('foobar', '1000000')
Actual call: get_role_set('1000000')
據我了解,這是可以預料的。 但是,如果我按照上面的原始方法進行測試,為什么還要得到一個AssertionError? 我不明白 修改后的測試顯示已使用('foobar','1000000')調用了方法get_role_set。 因此,如果我省略“ foobar”,為什么測試不會沒有錯誤地通過? (如果我注釋掉其他斷言,則實際上對於測試的最后一行會出現相同的錯誤。)
誰能告訴我我在做什么錯? 另外,對於菜鳥代碼中其他缺陷的提示將不勝感激。 謝謝。
您在這里混淆了兩種語法。 assert
是用於正則表達式的命令; 如果表達式不真實,則會引發異常。
assert_called_once_with
是Mock對象提供的方法,如果失敗,則再次引發AssertionError,否則返回None。
因此,這里有兩個斷言。 assert_called_once_with
調用的結果為None,這當然是虛假的。 因此您會從assert
語句中獲得AssertionError。
解決方案是簡單地刪除所有assert
關鍵字,而只保留assert_called_once
和assert_called_once_with
方法調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.