如何模拟 PyMongo 以使用 Flask 应用程序进行测试?

Ale*_*uer 5 python mongodb pytest flask

我发现了类似的问题,但它们似乎只涵盖了模拟 MongoDB 而没有提到 Flask。

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

我的问题是:如何确保此时正确模拟 PyMongo?根据PyTest-Mongo 文档,MongoDB 测试装置应该传递给每个测试函数,但是如果它在导入时崩溃,这对我没有帮助。

test_app.py:

import pytest
import pytest_mongodb

from app import app


@pytest.fixture
def client():
    app.config['TESTING'] = True
    return client
Run Code Online (Sandbox Code Playgroud)

应用程序.py:

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)
Run Code Online (Sandbox Code Playgroud)

ans*_*sev 5

我们可以将appand包装mongo在一个函数中。这之所以有效,是因为它mongo被用作局部变量。

应用程序.py

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
Run Code Online (Sandbox Code Playgroud)

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

测试应用程序.py

from app import get_app_with_config
from config import TestConfig

app, mongo = get_app_with_config(TestConfig)
Run Code Online (Sandbox Code Playgroud)

运行.py

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)
Run Code Online (Sandbox Code Playgroud)

config.py文件示例:

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
Run Code Online (Sandbox Code Playgroud)