2017-05-31 42 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