gpt4 book ai didi

python - 模拟数据库连接python

转载 作者:行者123 更新时间:2023-12-02 02:54:59 24 4
gpt4 key购买 nike

我有一个名为 redis_db.py 的文件,其中包含连接到 redis 的代码

import os
import redis
import sys

class Database:
def __init__(self, zset_name):
redis_host = os.environ.get('REDIS_HOST', '127.0.0.1')
redis_port = os.environ.get('REDIS_PORT', 6379)

self.db = redis.StrictRedis(host=redis_host, port=redis_port)
self.zset_name = zset_name

def add(self, key):
try:
self.db.zadd(self.zset_name, {key: 0})
except redis.exceptions.ConnectionError:
print("Unable to connect to redis host.")
sys.exit(0)

我有另一个名为 app.py 的文件,它是这样的

from flask import Flask
from redis_db import Database

app = Flask(__name__)
db = Database('zset')

@app.route('/add_word/word=<word>')
def add_word(word):
db.add(word)
return ("{} added".format(word))

if __name__ == '__main__':
app.run(host='0.0.0.0', port='8080')

现在我正在为这样的 add_word 函数编写单元测试

import unittest
import sys
import os
from unittest import mock

sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../api/")
from api import app # noqa: E402


class Testing(unittest.TestCase):

def test_add_word(self):
with mock.patch('app.Database') as mockdb:
mockdb.return_value.add.return_value = ""
result = app.add_word('shivam')
self.assertEqual(result, 'shivam word added.')

我面临的问题是,即使我在模拟 db 方法调用,它仍在调用类中的实际方法而不是返回模拟值,并且在测试期间我收到消息 Unable to connect to redis主机。

谁能帮我弄清楚如何模拟 redis 数据库调用。

我正在使用单元测试模块

最佳答案

问题在于 db 是在模块导入时定义的,因此 mock.patch 不会影响 db 变量。要么你移动实例化add_word(word) 函数中的 db 或者您修补 db 而不是 Database,例如

def test_add_word():
with mock.patch('api.app.db') as mockdb:
mockdb.add = mock.MagicMock(return_value="your desired return value")
result = app.add_word('shivam')
print(result)

请注意,add_word 的调用必须在 with block 中,否则将使用未模拟的版本。

关于python - 模拟数据库连接python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61305169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com