【问题标题】:Better approach to test the function更好的方法来测试功能
【发布时间】:2018-12-06 09:21:45
【问题描述】:

我尝试为这个简单的函数编写单元测试。基本上,它从 Slack 接收有效负载,然后构建一条消息,然后使用 API 将此消息发送给用户。

@slack_messages.on_pattern('(?i)^help$')
def handle_help_message(event, body, match):
    message = build_help_message()
    Slack(event['team_id']).send_message(body['user'], **message)

def build_help_message():
    text = "Hello"

    return {
        'text': text,
        'attachments': [
            build_basics(),
            build_controls()
        ]
    }

我写了这个测试,但是对于这么简单的功能来说它看起来太复杂了。如何让我的测试更简单?

class TestMesssageHandlers(TestCase):
    @mock.patch('slango.slack.Slack.send_message')
    @mock.patch('slango.slack.Slack.__init__')
    @mock.patch('apps.slackapp.help.handlers.build_help_message')
    def test_handle_help_message(self, build_message_mock, init_mock,
                                 send_message_mock):
        init_mock.return_value = None
        build_message_mock.return_value = {
            'text': mock.sentinel.text,
            'attachments': mock.sentinel.attachments
        }

        event = {
            'team_id': 'TEAMID',
            'event': {
                'text': 'help',
                'user': 'U111111'
            }
        }

        handle_help_message(event, event['event'])

        init_mock.assert_called_with(event['team_id'])
        send_message_mock.assert_called_with(
            event['event']['user'], **build_message_mock.return_value)

【问题讨论】:

    标签: python unit-testing testing refactoring


    【解决方案1】:

    单元测试用于发现可以在隔离代码中检测到的错误。但是,您的示例代码主要是与 Slack 组件的交互。也就是说,如果这段代码有bug,会和你如何调用Slack构造函数和send_message方法有关。

    但是,您不会在 Slack 类的模拟中发现这些错误:想象一下 send_message 方法的正确命名参数不是 textattachments,而是 txtattach - 与你的模拟,你永远不会注意到这个问题,因为你的模拟反映了你对其他组件如何工作的(错误)理解。

    结论是,对于这种代码,单元测试不是正确的方法,但集成测试是正确的。如果您需要更多示例,还可以查看这些问题,它们的方向相似:Mock a series of interdependent callsShould Unit Tests test against the REST API?

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2023-03-19
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多