Python 2.x:如何模拟 subprocess.Popen if stdin=PIPE
Python 2.x: How to mock subprocess.Popen if stdin=PIPE
我正在尝试模拟以下功能
from subprocess import Popen, PIPE
def run_query():
sql_cmd = "Some Query"
process = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
process.stdin.write(sql_cmd)
(process_stdout, process_stderr) = process.communicate()
下面是我写的测试函数:
@patch('subprocess.Popen')
def test_run_query(Popen):
Popen.return_value.communicate.return_value = (2, 1)
但是,我遇到了以下错误
Error occured while running sql command
Error output:
[Errno 2] No such file or directory
F
我尝试了其他 Whosebug post 但是没有这种例子。请帮忙。
您在错误的命名空间内修补 Popen
。
您需要在查找名称空间而不是定义名称空间的地方修补名称 Popen
。假设 mypackage/mymodule.py
是定义了 run_query
的模块:
from mypackage.mymodule import run_query
@patch('mypackage.mymodule.Popen')
def test_run_query(mock_popen):
proc = mock_popen.return_value
proc.communicate.return_value = "2", "1"
out, err = run_query()
assert out == "2"
assert err == "1"
proc.stdin.write.assert_called_once_with("Some Query")
有关详细信息,请参阅模拟文档中的 Where to patch。
我正在尝试模拟以下功能
from subprocess import Popen, PIPE
def run_query():
sql_cmd = "Some Query"
process = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
process.stdin.write(sql_cmd)
(process_stdout, process_stderr) = process.communicate()
下面是我写的测试函数:
@patch('subprocess.Popen')
def test_run_query(Popen):
Popen.return_value.communicate.return_value = (2, 1)
但是,我遇到了以下错误
Error occured while running sql command
Error output:
[Errno 2] No such file or directory
F
我尝试了其他 Whosebug post 但是没有这种例子。请帮忙。
您在错误的命名空间内修补 Popen
。
您需要在查找名称空间而不是定义名称空间的地方修补名称 Popen
。假设 mypackage/mymodule.py
是定义了 run_query
的模块:
from mypackage.mymodule import run_query
@patch('mypackage.mymodule.Popen')
def test_run_query(mock_popen):
proc = mock_popen.return_value
proc.communicate.return_value = "2", "1"
out, err = run_query()
assert out == "2"
assert err == "1"
proc.stdin.write.assert_called_once_with("Some Query")
有关详细信息,请参阅模拟文档中的 Where to patch。