python模拟app请求_如何在python(flask)webapp中模拟服务层进行单元测试?

我正在flask中开发一个webapp,并使用服务层从视图和api路由中抽象出数据库查询和操作。有人建议,这会使测试更容易,因为您可以模拟服务层,但我很难找到一个好的方法来实现这一点。举个简单的例子,假设我有三个SQLAlchemy模型:

型号.pyclass User(db.Model):

id = db.Column(db.Integer, primary_key = True)

email = db.Column(db.String)

class Group(db.Model):

id = db.Column(db.Integer, primary_key = True)

name = db.Column

class Transaction(db.Model):

id = db.Column(db.Integer, primary_key = True)

from_id = db.Column(db.Integer, db.ForeignKey('user.id'))

to_id = db.Column(db.Integer, db.ForeignKey('user.id'))

group_id = db.Column(db.Integer, db.ForeignKey('group.id'))

amount = db.Column(db.Numeric(precision = 2))

用户和组以及用户之间的交易(代表换钱)。现在我有了一个services.py它有一系列的功能,比如检查某些用户或组是否存在,检查某个用户是否是某个特定组的成员,等等。我在一个api路由中使用这些服务,该路由在请求中发送JSON并使用它向db添加事务,类似于:

路由.pyimport services

@app.route("/addtrans")

def addtrans():

# get the values out of the json in the request

args = request.get_json()

group_id = args['group_id']

from_id = args['from']

to_id = args['to']

amount = args['amount']

# check that both users exist

if not services.user_exists(to_id) or not services.user_exists(from_id):

return "no such users"

# check that the group exists

if not services.group_exists(to_id):

return "no such group"

# add the transaction to the db

services.add_transaction(from_id,to_id,group_id,amount)

return "success"

当我试图模拟这些服务进行测试时,问题就来了。我一直在使用mock library,我必须修补服务模块中的函数,以便将它们重定向到mock,如下所示:mock = Mock()

mock.user_exists.return_value = True

mock.group_exists.return_value = True

@patch("services.user_exists",mock.user_exists)

@patch("services.group_exists",mock.group_exists)

def test_addtrans_route(self):

assert "success" in routes.addtrans()

这感觉很糟糕,原因有很多。第一,修补感觉脏兮兮的;第二,我不喜欢修补我单独使用的每个服务方法(据我所知,没有办法修补整个模块)。

我想了一些办法来解决这个问题。重新分配routes.services,使其引用我的模拟而不是实际的服务模块,例如:routes.services = mymock

让服务成为类的方法,该类作为关键字参数传递给每个路由,并在测试中简单地传入我的mock。

与(2)相同,但有一个单例对象。

我在评估这些选项和考虑其他选项时遇到困难。在测试使用python web开发的路由时,从事pythonweb开发的人员通常如何模拟服务?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值