Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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 使用pytest模拟导入模块中包含的函数的行为_Python_Mocking_Pytest - Fatal编程技术网

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'
断言错误=“”

这就是补丁的用途。请看下面的示例: