2017-05-31 12 views
1

例えば、私はリストにアクセスしようとするいくつかのコードを持っている:Pythonでリストをモックする方法は?

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

私はsys.argv[0]を模擬する必要があります。

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() 

しかし、これは動作しません。だから私は、私のテストに@patch.objectを追加します。 Pytestはエラーを発生させます:

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

私は間違っていますか?

答えて

3

Mockオブジェクトを使用してリストを置き換えないで、sys.argvを別のリストに置き換えてください。

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

がテストディレクトリは、あなたがなりたかった実際のディレクトリの下にネストされていない限り、あなたはおそらく(ファイル名ではなくディレクトリに渡したいことに注意してください:あなたはまだ交換し、しかし取り消しを管理するためにmock.patchを使用することができます中古)。

モック設定を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

関連する問題