2017-11-05 1 views
0

私はworker_functions辞書からfun_1機能にパッチを適用しようとしていますし、私は苦労しているように見える:ファンクションマップ/ディクショナリでファンクションをモックする方法は?

cli.py:
import sys 

from worker_functions import (
    fun_1, 
    fun_2, 
    fun_3, 
) 

FUNCTION_MAP = { 
    'run_1': fun_1, 
    'run_2': fun_2, 
    'run_3': fun_3, 
} 

def main(): 
    command = sys.argv[1] 
    tag = sys.argv[2] 
    action = FUNCTION_MAP[command] 

    action(tag) 

私はcli.fun_1cli.main.actioncli.actionをからかってみたが、これは失敗につながっています。

test_cli.py:
from mock import patch 

from cli import main 


def make_test_args(tup): 
    sample_args = ['cli.py'] 
    sample_args.extend(tup) 
    return sample_args 


def test_fun_1_command(): 
    test_args = make_test_args(['run_1', 'fake_tag']) 
    with patch('sys.argv', test_args),\ 
     patch('cli.fun_1') as mock_action: 
     main() 

     mock_action.assert_called_once() 

私は何かが欠けているように見えるのですか?

答えて

1

FUNCTION_MAP辞書自体の参照を修正する必要があります。そうするpatch.dict() callableを使用します。FUNCTION_MAP辞書は、関数の参照が検索された場所であるためです

from unittest.mock import patch, MagicMock 

mock_action = MagicMock() 
with patch('sys.argv', test_args),\ 
    patch.dict('cli.FUNCTION_MAP', {'run_1': mock_action}): 
    # ... 

を。

+0

これは潜在的に鮮やかに見えます。 – GiantsLoveDeathMetal

+0

mockから 'MagicMock'をインポートしますか? – GiantsLoveDeathMetal

+1

はい、インポートを追加しました。 –

関連する問題