【问题标题】:Mocking a helper function in django view test在 django 视图测试中模拟辅助函数
【发布时间】:2017-07-08 20:15:05
【问题描述】:

我有一个发起用户登录请求的视图函数

看起来像这样:

def initiate_login(request):
    # get request parameters
    return check_user_and_send_otp(login_id)

然后请求由另一个函数处理

def check_user_and_send_otp(login_id):
    # check if user exits
    return send_otp_to_user(phone_number)

然后是另一个函数

def send_otp_to_user(phone_number):
    # sends a message to user
    return response

问题是在测试我的代码时,我不想在测试时向电话号码发送消息。

我的登录测试函数看起来有点像这样,是否可以在不更改代码的情况下模拟它?

    def test_login_initiator(self):
    response = self.client.post(self.login_url, data=self.login_data, content_type="application/json", **self.headers)
    self.assertEqual(response.status_code, 200)

所有这些被其他人调用的函数都位于单独的模块中

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    如果您不想在实体手机上实际接收消息,可以使用在线短信接收器。看看这个blog

    此外,您还可以通过 Way2sms 等其他免费在线服务发送消息。你只需要用谷歌搜索它们。要在 Python 中执行此操作,您需要使用 urllib2/requests 和 beautifulsoup 进行 Web 解析,这是一个全新的问题。

    或者您可以通过简单地注释掉消息发送者代码或从函数中返回 true 来跳过此函数。

    如果你想危险地生活,考虑制作一个配置文件,它可以帮助你做出决定是否执行某事的开关。

    【讨论】:

    • 感谢您的快速响应,send_otp 函数实际上调用第三方 API 向用户的手机发送短信,response 是如果消息成功,我可以发布实际代码 sn- p 如果你愿意。这只是为了简化事情。
    • 哦,基本上,您是在尝试检查短信是否已成功发送到手机,但不想实际发送消息,对吗?
    • 我只希望函数返回 true(即消息已发送)但实际上不发送消息。这就像用return True之类的东西覆盖
    • 注释掉可能对我有用,但是在运行单元测试时这样做是一个好习惯吗?如果其他人运行我的测试,他可能不记得将其注释掉。
    • 您可以随时在文档中包含要评论的内容和不评论的内容,因此其他人使用该模块不会有问题。注释掉代码只是告诉编译器跳过这部分,所以这是一个很好的做法。您可能面临的唯一问题是当您丢失源代码并尝试通过反编译 pyc 文件来取回它时。你有点回答了你自己的问题。 return True 有效。
    【解决方案2】:

    正确的做法是使用诸如魔术模拟之类的东西并将代码构造成适当的类,以便我们可以为每个类创建模拟对象。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2020-04-24
    • 2021-04-22
    相关资源
    最近更新 更多