2017-05-31 78 views
1

例如,我有一些代码,试图访问列表:如何在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 

我在做什么错?

回答

3

请勿使用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 
[''] 
+0

感谢马亭, “@ mock.patch.object(SYS, 'ARGV',[THIS_DIR])” 版本的作品! – kinORnirvana