我尝试为这个简单的函数编写单元测试。基本上,它从 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)
最佳答案
单元测试用于发现那些可以在隔离代码中检测到的错误。但是,您的示例代码以与 Slack
组件的交互为主。也就是说,如果这段代码中存在错误,它们将与您如何调用Slack
构造函数和send_message
方法有关。
但是,您不会发现这些错误与 Slack 类的模拟:想象一下 send_message
方法的正确命名参数不是 text
和 attachments
,但是 txt
和 attach
- 使用您的模拟,您永远不会注意到这个问题,因为您的模拟反射(reflect)了您对其他组件的(错误)理解工作。
结论是,对于这种代码,单元测试不是正确的方法,集成测试才是。如果您需要更多示例,您还可以查看这些方向相似的问题:Mock a series of interdependent calls , 或 Should Unit Tests test against the REST API? .
关于python - 更好的方法来测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648105/