簡體   English   中英

Python 3.6初學者:為什么為assert_Called_once_with獲得一個空白的AssertionError(單元測試和模擬)

[英]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_onceassert_called_once_with方法調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM