首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何模拟PyMongo的测试与一个烧瓶应用?

我如何模拟PyMongo的测试与一个烧瓶应用?
EN

Stack Overflow用户
提问于 2019-05-07 19:12:51
回答 2查看 3.4K关注 0票数 5

我也发现了类似的问题,但它们似乎只涵盖了嘲弄MongoDB的内容,而没有提到水瓶。

我有一个酒瓶应用程序,我正在尝试用PyTest对它进行单元测试(包括PyTest和PyTest-烧瓶)。然而,在编写任何测试之前,我的测试脚本都会崩溃。崩溃发生在使用我的Flash应用程序导入脚本时:它试图创建没有url的PyMongo对象。

我的问题是:如何确保PyMongo在这一点上被正确地模仿?根据PyTest-Mongo文档,MongoDB测试夹具应该传递给每个测试函数,但是如果它在导入上崩溃了,这对我没有帮助。

test_app.py:

代码语言:javascript
复制
import pytest
import pytest_mongodb

from app import app


@pytest.fixture
def client():
    app.config['TESTING'] = True
    return client

app.py:

代码语言:javascript
复制
import ...

app = Flask(__name__)
app.config["MONGO_DBNAME"] = os.environ.get('DB_NAME')
app.config["MONGO_URI"] = os.environ.get('MONGO_URI')
app.secret_key = os.environ.get('SECRET')

mongo = PyMongo(app)

...

if __name__ == '__main__':
app.run(host=os.environ.get('IP'),
        port=int(os.environ.get('PORT')),
        debug=False)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 13:31:08

我们可以将appmongo包装在一个函数中,这是因为mongo被用作本地变量。

app.py

代码语言:javascript
复制
from flask import Flask
from flask_pymongo import PyMongo

def get_app_with_config(config):

    app = Flask(__name__)
    app.config.from_object(config)
    mongo = PyMongo(app)

    @app.route("/")
    def index():
        pass
    .
    .
    
    return app, mongo

然后,我们可以使用不同的数据库创建一个测试文件和一个应用程序执行文件:

test_app.py

代码语言:javascript
复制
from app import get_app_with_config
from config import TestConfig

app, mongo = get_app_with_config(TestConfig)

run.py

代码语言:javascript
复制
from app import get_app_with_config
from config import RunConfig

app, mongo = get_app_with_config(RunConfig)

if __name__ == '__main__':
    app.run(port=8000)

config.py文件示例:

代码语言:javascript
复制
class RunConfig:

    MONGO_HOST = '192.168.1.37'
    MONGO_PORT = 27017
    MONGO_DBNAME = 'my_database'
    MONGO_URI = f"mongodb://{MONGO_HOST}:{MONGO_PORT}/{MONGO_DBNAME}"

class TestConfig:

    MONGO_HOST = '192.168.1.37'
    MONGO_PORT = 27017
    MONGO_DBNAME = 'my_database_test'
    MONGO_URI = f"mongodb://{MONGO_HOST}:{MONGO_PORT}/{MONGO_DBNAME}"
    TESTING = True
票数 3
EN

Stack Overflow用户

发布于 2019-07-04 07:30:03

需要快速修复,所以我编辑了app.py,以便只有在执行文件时PyMongo不初始化时才会硬失败(也就是说,当运行单元测试时,它会忽略PyMongo失败的初始化)。

代码语言:javascript
复制
app = Flask(__name__)
app.config["MONGO_DBNAME"] = os.environ.get('DB_NAME')
app.config["MONGO_URI"] = os.environ.get('MONGO_URI')
app.secret_key = os.environ.get('SECRET')

try:
    mongodb = PyMongo(app).db
except ValueError:
    """We don't provide a URI when running unit tests, so PyMongo will fail to initialize.
    This is okay because we replace it with a version for testing anyway. """
    print('PyMongo not initialized!')
    mongodb = None
.
.
.

if __name__ == '__main__':
    if not mongodb:
        print('Cannot run. PyMongo failed to initialize. Double check environment variables.')
        exit(1)

    app.run(host=os.environ.get('IP'),
            port=int(os.environ.get('PORT')),
            debug=False)

在我的测试文件中,我只是在需要它的测试中将模拟的mongoDB客户端分配给应用程序。绝对不是理想的解决方案。

代码语言:javascript
复制
def test_redacted(client, mongodb):
    app.mongodb = mongodb
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56029111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档