Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入时模拟模块全局变量_Python_Python 3.x_Api_Unit Testing_Flask - Fatal编程技术网

Python 导入时模拟模块全局变量

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中导入此

我正在为连接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中导入此模块时出现问题。我想用特殊的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。