kin*_*ana 5 python unit-testing mocking pytest python-mock
例如,我有一些尝试访问列表的代码:
def some_code():
script_dir = os.path.dirname(sys.argv[0])
Run Code Online (Sandbox Code Playgroud)
我需要嘲笑sys.argv[0]。因此,我添加@patch.object到测试中:
import os
import sys
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
@mock.patch.object(sys, 'argv', mock.Mock(return_value=[THIS_DIR]))
def test_mytest():
some_code()
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。Pytest引发错误:
> script_dir = os.path.dirname(sys.argv[0])
E TypeError: 'Mock' object does not support indexing
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Mar*_*ers 11
不要使用Mock对象来替换列表,只需sys.argv用不同的列表替换即可。但是,您仍然可以使用mock.patch来管理替换和撤消:
@mock.patch.object(sys, 'argv', [THIS_DIR])
Run Code Online (Sandbox Code Playgroud)
请注意,您可能希望传入文件名,而不是目录(除非您的测试目录嵌套在您想要使用的实际目录下)。
您的模拟配置替换sys.argv为可调用对象,因此只会sys.argv()生成您的[THIS_DIR]列表。
演示:
>>> import sys
>>> from unittest import mock
>>> sys.argv
['']
>>> with mock.patch.object(sys, 'argv', ['foo', 'bar', 'baz']):
... sys.argv
...
['foo', 'bar', 'baz']
>>> sys.argv
['']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3720 次 |
| 最近记录: |