首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mock.assert_has_calls()没有按预期工作

Mock.assert_has_calls()没有按预期工作
EN

Stack Overflow用户
提问于 2020-08-03 18:30:42
回答 1查看 4.9K关注 0票数 2

在这个单元测试中,我希望确保Django自定义管理任务正在向其日志中写入特定的消息。

代码语言:javascript
运行
复制
from unittest.mock import Mock, patch

...

    @override_settings(HR_SYNC_DATA_DIR=f"{settings.BASE_DIR}/core/management/tests/HR_SYNC_DATA_DIR")
    @patch('core.management.commands.process_hr_changes.log')
    @patch('core.management.commands.process_hr_changes.requests.get')
    def test_sync_users2(self, mock_get, mock_log):
        #
        # Load our Mock data
        #
        test_data_dir = f"{settings.BASE_DIR}/core/management/tests/TEST_DATA_DIR"
        get_mocks = []
        for filename in glob.glob(path.join(test_data_dir, 'test-data-hrdata_underrun_page_*.json')):
            with open(filename, "r") as infile:
                mock_response = Mock(ok=True)
                mock_response.json.return_value = json.load(infile)
                mock_response.status_code = status.HTTP_200_OK
                get_mocks.append(mock_response)
        mock_get.side_effect = get_mocks
        with self.assertRaises(CommandError) as context:
            call_command('process_hr_changes')
        print(context.exception)
        self.assertEqual('percent change is -0.125 and delta_pct is 0.1. Lifecycle is dev.', context.exception.args[0])
        mock = Mock(return_value=None)
        info_calls = [
            mock.call('rehires = 0 new hires = 0 terminations = 5.'),
            mock.call('process_hr_changes args are: delta_pct 0.1 how_many_hours_back 24 dry_run False debug is False verbose is False'),
            mock.call('test: startup'),
            mock.call('Removing directory /apps/core/management/tests/HR_SYNC_DATA_DIR.'),
            mock.call('Creating directory /apps/core/management/tests/HR_SYNC_DATA_DIR.'),
            mock.call('percent change is -0.125 and delta_pct is 0.1.'),
        ]
        for mock_call in mock_log.info.mock_calls:
            print(mock_call)
        mock_log.info.assert_has_calls(info_calls, any_order=True)

当我运行此测试时,它会在带有以下消息的mock_log.info.assert_has_calls(info_calls, any_order=True)语句上失败:

代码语言:javascript
运行
复制
AssertionError: (<MagicMock name='log.call()' id='140711932625744'>, <MagicMock name='log.call()' id='140711932625744'>, <MagicMock name='log.call()' id='140711932625744'>, <MagicMock name='log.call()' id='140711932625744'>, <MagicMock name='log.call()' id='140711932625744'>, <MagicMock name='log.call()' id='140711932625744'>) not all found in call list

我还看到了我的打印语句的输出:

代码语言:javascript
运行
复制
call('process_hr_changes args are: delta_pct 0.1 how_many_hours_back 24 dry_run False debug is False verbose is False')
call('test: startup')
call('Removing directory /apps/core/management/tests/HR_SYNC_DATA_DIR.')
call('Creating directory /apps/core/management/tests/HR_SYNC_DATA_DIR.')
call('rehires = 0 new hires = 0 terminations = 5.')
call('percent change is -0.125 and delta_pct is 0.1.')

我做错了什么?

谢谢

更新:

我不得不把我的代码改为:

代码语言:javascript
运行
复制
from unittest.mock import Mock, patch, call  # need to import call.

...

        info_calls = [
            call('rehires = 0 new hires = 0 terminations = 5.'),
            call('process_hr_changes args are: delta_pct 0.1 how_many_hours_back 24 dry_run False debug is False verbose is False'),
            call('test: startup'),
            call('Removing directory /apps/core/management/tests/HR_SYNC_DATA_DIR.'),
            call('Creating directory /apps/core/management/tests/HR_SYNC_DATA_DIR.'),
            call('percent change is -0.125 and delta_pct is 0.1.'),

        ]
        mock_log.info.assert_has_calls(info_calls, any_order=True)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 19:20:11

您正在将Mock.call的结果传递给assert_has_calls。但是,assert_has_calls需要一个顶级的call对象。

注意,在阅读了文档之后,我同意这一点并不是很清楚。这是assert_has_calls的文档

断言已使用指定的调用调用了模拟。将检查mock_calls列表中的调用。

如果any_order是假的,那么调用必须是顺序的。可以在指定的呼叫之前或之后进行额外的呼叫。

如果any_order是真的,那么调用可以是任意顺序的,但是它们都必须出现在mock_calls中。

模拟(return_value=None)模拟(1)模拟(2)模拟(3)模拟(4)调用=调用(2),调用(3)mock.assert_has_calls(调用)调用=调用(4),调用(2),调用(3)mock.assert_has_calls(调用,any_order=True)

在该示例中,还不清楚call对象来自何处。我能看到混乱。

只有当您看到call文档时,它才变得更加清晰(强调我的):

call()是一个帮助对象,用于进行简单的断言,与call_args、call_args_list、mock_calls和method_calls进行比较。assert_has_calls().

也可以使用调用()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63235007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档