在HTTP Flask端点请求单元测试中模拟Redis/MongoDB的最佳方法

rsaldnfx  于 2023-10-15  发布在  Redis
关注(0)|答案(1)|浏览(102)

我有一个Flask API('app'),它的定义类似于:

import redis 
import pymongo
...

redis_client=redis.connect("redis url")
mongo_client = mongo.connect("mongo url")

@app.route('/dostuff', methods=['GET', 'POST'])
def do_stuff_with_dbs():
   if request.method == 'POST':
      redis_client.lpush(post_data)
      mongo_client.create_one(post_data)
      return 200
   if request.method == 'GET':
      list = redis_client.lrange(list, 0 ,-1)
      docs = mongo_client.find({})
      return list, docs

我想定义一个可以调用端点的测试,但是API创建了自己的数据库连接,所以我不知道如何模拟它们,因为它们没有传入。
这就是我想做的:

from app import app

def test_get():
   response = app.test_client().get('/dostuff')
   assert response.status_code = 200
   assert response.data == {[list], {docs}}
   ...

我已经找到了很多关于如何模拟你传入的redis客户端的信息,但是这些端点不接受redis客户端参数,所以我不知道如何在应用程序端伪造连接。
任何信息或资源将不胜感激。
我试过模拟一些redis的示例,但当应用程序试图连接到redis时,总是出现错误。

w51jfk4q

w51jfk4q1#

对于Mocking,您可以使用Mock Object Library from unittest。为了简单的使用,你可以这样做:

from app import app, redis_client, mongo_client
from unittest.mock import MagicMock

def test_get():
   redis_return_example = []
   mongo_return_example = {}
   redis_client.lrange = MagicMock(return_value=redis_return_example)
   mongo_client.find =  MagicMock(return_value=mongo_return_example)
   response = app.test_client().get('/dostuff')
   assert response.status_code = 200
   assert response.data == {[list], {docs}}
   ...

只是为了澄清,这将分别从redis_clientmongo_client中模拟函数lrangefind。如果你想模拟更多的函数或整个对象,请查看库文档。
作为一个个人的注意,而不是嘲笑,我建议你让他们指向一个为测试而创建的数据库。这将允许您进行更好的测试,因为您可以测试整个数据流。要做到这一点,你可以简单地做一些像这样的事情:

from app import app, redis_client, mongo_client

def test_get():
   redis_client = redis.connect("redis test url")     # Redefine the Redis database object before the test
   mongo_client = mongo.connect("mongo test url")   # Redefine the Mongo database object before the test
   response = app.test_client().get('/dostuff')
   assert response.status_code = 200
   assert response.data == {[list], {docs}}
   ...

另外,如果你要做测试,我建议你看看python unittest library,这是非常有用的。

相关问题