2017-03-22 18 views
1

os.path.existsの動作を模擬して、os.path.existsがファイル/フォルダが存在しないことを報告するときにスクリプトが正しく動作するかどうかを確認できるようにしたい。BDDのステップファイルを模擬する方法

@when("Service starts with input file that does not exist") 
def step_impl(context): 
    """ 
    :type context: behave.runner.Context 
    """ 
    json_file_path = "fake_file_path" 
    mock_os_path = mock.Mock() 
    mock_os_path.exists.return_value = False 

    context.returncode = dicom_send_service.launch(json_file_path) 

    mock_os_path.exists.assert_called_once_with(json_file_abspath) 

私のスクリプトにモックを挿入するにはどうすればよいですか?あなたはstep_implメソッドが宣言に基づいて2つの引数を期待見ることができるように

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/behave/model.py", line 1456, in run 
    match.run(runner.context) 
    File "/usr/local/lib/python2.7/dist-packages/behave/model.py", line 1903, in run 
    self.func(context, *args, **kwargs) 
TypeError: step_impl() takes exactly 2 arguments (1 given) 

が、BDDだけでそれと呼ばれる:私は、メソッドのpythonのリターンを実行したとき、私は、しかし

@mock.patch("mymodule.os.path") 
@when("Service starts with input file that does not exist") 
def step_impl(context, mock_os_path): 

を使用しようとしました1(文脈の値)、擬似注釈は取り上げられなかった。

import os 

def validate(json_file_path): 
    """Method which validates the JSON file, an error message is returned if the file fails verification. 

     json_file_path -- the path to the file with the message configuration details""" 
    if not os.path.exists(json_file_path): 
     return "Could not find file at path {0}".format(json_file_path) 
    ... 
    return "" 

def launch(json_file_path): 
    error_message = valid(json_file_path) 
    if error_message: 
     print(error_message) 
     return 1 

答えて

3

だから自分の質問に答えるために、あなたはwith mock.patch構文を使用する必要があります:

with mock.patch('name of thing to mock') as name_of_mock: 

したがって、上記の私の例になるでしょう:

ここ

は、私がテストしていたコードです

@when("Service starts with input file that does not exist") 
def step_impl(context): 
    """ 
    :type context: behave.runner.Context 
    """ 
    json_file_path = "fake_file_path" 

    # This is where the magic happens 
    with mock.patch ('os.path') as mock_os_path: 

     mock_os_path.exists.return_value = False 

     context.returncode = dicom_send_service.launch(json_file_path) 

     mock_os_path.exists.assert_called_once_with(json_file_abspath) 

私はそれをテストしましたが、それは魅力的です。 JavaのMockitoやPowermockのような他のモッキングフレームワークを使うよりもずっと簡単です。