我可以使用部分实现来构建测试期望吗?

2022-12-01 05:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在整个应用程序中多次使用build_help_message,它返回一个大字典,其中包含我需要使用Client库发送的textattachments

可以使用build_help_message在测试中生成预期结果吗?如果这不是一个好的做法,我如何避免这样做

def help_handler(payload):
    team_id = payload['team_id']
    user_id = payload['user_id']

    message = build_help_message(team_id, user_id)

    Client(team_id).send_message(user_id, **message)

测验

class TestHandler(TestCase):
    def setUp(self):
        team = Team.objects.create(team_id='TEAMID')
        User.objects.create(team=team, user_id='USERID')

    def tearDown(self):
        ...

    @mock.patch('client.Client.send_message')
    def test_correct_text(self, send_message_mock):
        payload = {'team_id': 'TEAMID', 'user_id': 'USERID'}

        handle_message(payload)

        expected_message = build_help_message('TEAMID', 'USERID')

        send_message_mock.assert_called_with('USERID', **expected_message)

Tags: textbuildselfclientsendidmessagedefhelpmockteampayloaduseriduserteamid
1条回答
网友
1楼 · 发布于 2022-12-01 05:34:23

嗯,在测试中重新实现build_help_message肯定不是更好。您可以做的(以及unittest纯化论者在这里可能建议的)是重写help_handler,以便可以注入build_message依赖项,即:

def help_handler(payload, build_help_message=build_help_message):
    team_id = payload['team_id']
    user_id = payload['user_id']

    message = build_help_message(team_id, user_id)

    Client(team_id).send_message(user_id, **message)

然后也模拟build_message——但是单元测试纯粹主义者也希望您对Client(而不是使用Mock)也这样做

虽然依赖注入是解决某些问题的非常强大的解决方案,也是每个开发人员都应该知道的事情,以“可测试性”的名义在任何地方应用它通常都是在浪费时间,至少在语言动态性足以支持monkeypatching的情况下是这样,而且也不一定有助于提高wrt/可读性

就你的例子而言,就我而言,没有更多的背景(在不了解项目的情况下,总是很难做出明智的决定),我真的不会再做任何事情了——当然,除了单元测试build_help_message,但我认为这已经是事实;-)