我有一个方法——run_script()
- 我想测试一下。具体来说,我想测试一下调用subprocess.Popen https://docs.python.org/3/library/subprocess.html#subprocess.Popen发生。测试一下会更好subprocess.Popen
使用某些参数进行调用。当我运行测试时,我得到了TypeError: 'tuple' object is not callable
.
我如何测试我的方法以确保subprocess
实际上是使用模拟来调用的吗?
@mock.patch("subprocess.Popen")
def run_script(file_path):
process = subprocess.Popen(["myscript", -M, file_path], stdout=subprocess.PIPE)
output, err = process.communicate()
return process.returncode
def test_run_script(self, mock_subproc_popen):
mock_subproc_popen.return_value = mock.Mock(
communicate=("ouput", "error"), returncode=0
)
am.account_manager("path")
self.assertTrue(mock_subproc_popen.called)
对我来说,你使用补丁装饰器而不是run_script
函数,因为你没有在那里传递模拟参数。
这个怎么样:
from unittest import mock
import subprocess
def run_script(file_path):
process = subprocess.Popen(["myscript", -M, file_path], stdout=subprocess.PIPE)
output, err = process.communicate()
return process.returncode
@mock.patch("subprocess.Popen")
def test_run_script(self, mock_subproc_popen):
process_mock = mock.Mock()
attrs = {"communicate.return_value": ("output", "error")}
process_mock.configure_mock(**attrs)
mock_subproc_popen.return_value = process_mock
am.account_manager("path") # this calls run_script somewhere, is that right?
self.assertTrue(mock_subproc_popen.called)
现在,您的模拟 subprocess.Popen 似乎返回一个元组,导致 process.communicate() 引发TypeError: 'tuple' object is not callable.
。因此,最重要的是让mock_subproc_popen 的return_value 恰到好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)