Python 使用pytest模拟导入模块中包含的函数的行为
假设我有两个文件Python 使用pytest模拟导入模块中包含的函数的行为,python,mocking,pytest,Python,Mocking,Pytest,假设我有两个文件main.py和test\u main.py。main.py的内容包括: import os print('script running', os.getcwd()) import pytest import main test\u main.py的内容包括: import os print('script running', os.getcwd()) import pytest import main 运行pytest-s返回以下内容: ==============
main.py
和test\u main.py
。main.py
的内容包括:
import os
print('script running', os.getcwd())
import pytest
import main
test\u main.py
的内容包括:
import os
print('script running', os.getcwd())
import pytest
import main
运行pytest-s
返回以下内容:
================================================= test session starts ==================================================
platform linux -- Python 3.8.6, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /home/example_mocking
plugins: dash-1.20.0, anyio-2.2.0
collecting ... script running /home/example_mocking
collected 0 items
================================================ no tests ran in 0.01s =================================================
现在假设有人向我提供了main.py
,我宁愿在实现完全测试转换之前不修改它。但是,我想修改os.getcwd()
的行为,使其返回“Hello”,而不是我当前的工作目录
有没有一种方法可以在不修改main.py
的情况下模拟os
的行为,从而在运行pytest-s
时显示以下内容
================================================= test session starts ==================================================
platform linux -- Python 3.8.6, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /home/example_mocking
plugins: dash-1.20.0, anyio-2.2.0
collecting ... script running Hello
collected 0 items
================================================ no tests ran in 0.01s =================================================
感谢您的帮助。我建议您重构脚本,使其在导入时不会产生副作用——如果没有污染,很难正确地进行修补和测试 这是一个经过调整的设置,它仍然可以运行,但更易于测试(你可以在我放在这里的视频中找到更多关于这项技术的信息:)
#main.py
导入操作系统
def main()->int:
打印('scriptrunning',os.getcwd())
返回0
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
升起系统出口(主()
#main_test.py
导入操作系统
从unittest导入模拟
进口干管
def测试主打印cwd(capsys):
#可以调整“getcwd”返回的内容
使用mock.patch.object(os'getcwd',return_value='Hello'):
assert main.main()==0#可以测试程序的返回值
#可以测试程序打印的内容
out,err=capsys.readouterr()
assert out=='script running Hello\n'
断言错误=“”
这就是补丁的用途。请看下面的示例: