如何测试一个函数,它返回的东西,并有副作用?

2024-04-26 05:32:41 发布

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

我有一个函数,它返回一些东西,但同时也有副作用。我应该只测试这个函数返回的值还是需要测试副作用的结果?你知道吗

@slack_interactions.on('admin_add')
def handle_admin_add(payload):
    team_id = payload['team']['id']
    user_id = payload['user']['id']
    action_value = payload['actions'][0]['selected_options'][0]['value']

    user = SlackUser.objects.find_by_ids(team_id, action_value)

    if user and not user.is_bot:
        user.make_admin()

    return build_admins_message(team_id, user_id)

Tags: 函数addidadminvalueondefaction
2条回答

简单回答,两个都测试。你知道吗

长话短说: 您应该始终记住,测试是验证对于给定的输入,您是否期望特定的输出。你知道吗

记住这一点,如果你的功能修改了状态(副作用),那么你需要验证状态是否按预期修改。如果它还返回一个值,那么您需要验证返回的值是否符合预期的值。你知道吗

测试是确保代码健壮性的一个好方法,只要您理解代码背后的禅。我必须为我所期望的进行测试,为意想不到的事情设计测试。

然而,单独的测试并不能生成好的代码,如果您有一个方法可以完成两件以上的事情,那么它可能是没有正确设计的。通常,影响状态的方法不应返回值,反之亦然。它不是一成不变的,但是如果你遵循这个惯例,你的系统就更容易解耦了。你知道吗

有一些编码原则可以防止将来的麻烦,其中之一就是单一责任原则。在这种情况下,你的功能显然违反了。我建议您看看SOLID编程原则,相信我,这是值得的。一旦你采用了单元测试,单元测试就会自然而然地出现。你知道吗

我建议同时进行测试,因为sideeffect和返回值都是函数行为的一部分,也是与代码交互的接口的一部分。你知道吗

为了实现这一点,您可以使用一个模拟库,比如内置的unittest.mock,这样您就可以模拟对user.make\u管理()和完整的SlackUser对象。你知道吗

我建议阅读MagicMockpatch的文档来简化测试。你知道吗

测试愉快!你知道吗

相关问题 更多 >