Python 导入时模拟模块全局变量
我正在为连接MongoDB的api编写单元测试。在我的API模块中,它如下所示:Python 导入时模拟模块全局变量,python,python-3.x,api,unit-testing,flask,Python,Python 3.x,Api,Unit Testing,Flask,我正在为连接MongoDB的api编写单元测试。在我的API模块中,它如下所示: from flask import Flask, jsonify from MyApp import MongoData api = Flask(__name__) DB_CONN = MongoData() @api.route('/bla', methods=['GET']) def alive(): return jsonify({'response': true}) 在unittest中导入此
from flask import Flask, jsonify
from MyApp import MongoData
api = Flask(__name__)
DB_CONN = MongoData()
@api.route('/bla', methods=['GET'])
def alive():
return jsonify({'response': true})
在unittest中导入此模块时出现问题。我想用特殊的mock类模拟MongoData()中的集合,该类使用mongomock。问题是在测试中导入时无法模拟DB_CONN:
from MyApp import api
我试着用mock做这件事:
DB_CONN = MockMongoData()
with mock.patch('MyApp.api.DB_CONN', DB_CONN):
from MyApp import api
但它仍尝试按照配置文件中的指定连接到数据库
有关于如何从MyApp.api模块模拟DB_CONN的建议吗
提前谢谢
编辑:
这将有助于:
import sys
from MyApp import MongoData, MockMongoData
sys.modules['MyApp'].MongoData = MockMongoData
from MyApp import api
但是有没有更好的(更具python风格的)方法呢?首先导入模块,然后导入monkeypatch及其成员:
DB_CONN = MockMongoData()
from MyApp import api
with mock.patch('MyApp.api.DB_CONN', DB_CONN):
api.run()
问题是解释器在执行MyApp import api中的
时创建MongoData类的实例。该实例将被隐藏,因此它将处于空闲状态,什么也不做。如果您根本不想创建实例,请将其移动到\uuuu name\uuuu==“\uuuu main\uuuu”
块或任何用于启动服务器的块中。您正在模拟对象MyApp.api.DB\u CONN
,并将其一起导入。尝试只模拟,不导入我正在导入MyApp.api中的所有内容,以及我想要测试的方法,因此模拟而不是导入将不起作用。方法依赖于与数据库的连接,因此我必须在导入的模块中模拟DB_CONN。