假设我们有以下Flask视图功能要测试。具体来说,我们想在create_foo()
写入文件系统时对其进行模拟。
# proj_root/some_project/views.py
from some_project import APP
from some_project.libraries.foo import create_foo
@APP.route('/run', methods=['POST']
def run():
bar = create_foo()
return 'Running'
现在,我们要为run()
编写单元测试,并模拟create_foo()
的调用,以避免创建不必要的文件。
# proj_root/tests/test_views.py
from some_project import some_project
@pytest.fixture
def client():
some_project.APP.config['TESTING'] = True
with some_project.APP.test_client() as client:
yield client
def test_run(client, monkeypatch):
monkeypatch.setattr('some_project.libraries.foo.create_foo', lambda: None)
response = client.post('/run')
assert b'Running' in response.data
即使命名的create_foo
导入似乎也可以使用这种方法。测试全部通过,但是每次运行测试套件时,create_foo
的原始代码显然会在文件系统中创建新文件时执行。我想念什么?我怀疑这与基于一些相关问题的命名导入有关,但我不确定。
答案 0 :(得分:2)
好吧,我实际上在发布后不久就找到了答案。正确的Monkeypatch是:
monkeypatch.setattr('some_project.views.create_foo', lambda: None)
here对此原因进行了很好的解释。