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

标签 python unit-testing testing mocking integration-testing

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

是否可以使用 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)

最佳答案

好吧,在你的测试中重新实现 build_help_message 当然不会更好。您可以做的(以及 unittest 纯粹主义者可能在这里推荐的)是重写 help_handler 以便您可以注入(inject) 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) .

虽然依赖注入(inject)是解决某些问题的非常强大的解决方案,也是每个开发人员都应该知道的事情,但以“可测试性”的名义在任何地方应用它往往是浪费时间/好处 - 至少当然,当语言足够动态以支持 monkeypatching 时——也不一定有助于 wrt/可读性。

对于你的例子,就我而言,没有更多的上下文(在不了解项目的情况下做出明智的决定总是很困难),我真的不会费心做更多的事情 - 当然单元测试除外 build_help_message 也是,但我认为情况已经如此 ;-)

关于python - 我可以使用部分实现来建立测试期望吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54022203/

相关文章:

python - “模块”对象在服务器运行时不可调用,但在 django 控制台中可以调用

c# - 文本文件导入项目中的 TDD

testing - 有没有办法从 SE37 导出测试参数?

.net - 使用依赖注入(inject),我发现自己创建了工厂来进行单元测试。这是正常的吗?

python - 如何使用子包正确打包Python3应用程序

python - 域名扩展错误检查;如何限制电子邮件地址中 '.' 之后的字符限制?

javascript - 如何返回在我的 vuejs 组件上更新的数据

unit-testing - Cakephp 2.3 单元测试参数 ['requested' ]

java - 如何在 JUnit5 中为测试套件设置自定义测试执行顺序?

python - Bokeh 小部件 - 工作复选框组示例