繁体   English   中英

如何在Python中模拟列表?

[英]How to mock a list in Python?

例如,我有一些试图访问列表的代码:

def some_code():
    script_dir = os.path.dirname(sys.argv[0])

我需要模拟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()

但这不起作用。 Pytest引发错误:

>     script_dir = os.path.dirname(sys.argv[0])
E     TypeError: 'Mock' object does not support indexing

我究竟做错了什么?

不要使用Mock对象替换列表,只需将sys.argv替换为其他列表即可。 您仍然可以使用mock.patch来管理替换和撤消:

@mock.patch.object(sys, 'argv', [THIS_DIR])

请注意,您可能希望传入文件名,而不是目录(除非您的测试目录嵌套在您想要使用的实际目录下)。

您的模拟配置将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
['']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM