2017-03-22 16 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) 

내 모의 문장을 내 스크립트에 삽입하려면 어떻게해야합니까? 나는 방법 파이썬 반환 실행할 때, 그러나

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

를 사용하려고 :

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) 

을 당신이 step_impl 방법이 선언에 따라 2 개 인자를 기대 볼 수 있듯이, 그러나 BDD는 그것을 호출 1 (컨텍스트 값) 및 mock 주석은 선택되지 않았습니다. 여기

는 내가 테스트입니다 코드 :

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

그래서 내 위의 예는 될 것이다 :

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 구문을 사용할 필요가

@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과 같은 다른 조롱 프레임 워크를 사용하는 것보다 훨씬 쉽습니다.