python - 更好的方法来测试功能

标签 python unit-testing testing refactoring

我尝试为这个简单的函数编写单元测试。基本上,它从 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 方法的正确命名参数不是 textattachments ,但是 txtattach - 使用您的模拟,您永远不会注意到这个问题,因为您的模拟反射(reflect)了您对其他组件的(错误)理解工作。

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

关于python - 更好的方法来测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648105/

相关文章:

python - Sentry 不断返回不存在的事件 ID

node.js - 如何在 oclif 中使用 cli-ux 提示测试用户输入?

testing - 测试Vue.js(^2.5.*)组件时提示prop被突变如何处理

python - 使用日期时间确定时间间隔内的最高频率事件

python - 使用 Nginx 在 Debian9 上安装 Let's encrypt/Certbot

python - 加载数据时 Django 中出现 Unicode 错误

python - 如何在 Django 测试中使用 AssertRaisesMessage()

linux - 基于 Bash 的热重载实现

python - 如何正确构建 SQLAlchemy(声明式)python 项目及其单元测试

android - 如何从应用内结算功能中删除信用卡?