2017-03-09 2 views
1

저는 Python 테스트를 처음 사용합니다. 나는 pytest를 사용 중이며 mock 및 패치에 대해 배우기 시작했습니다. 내 방법 중 하나에 대한 테스트 사례를 작성하려고합니다.파일 열기 및 예외 예외 처리

helper.py

def validate_json_specifications(path_to_data_folder, json_file_path, json_data) -> None: 

    """ Validates the json data with a schema file. 
    :param path_to_data_folder: Path to the root folder where all the JSON & schema files are located. 
    :param json_file_path: Path to the json file 
    :param json_data: Contents of the json file 
    :return: None 
    """ 

    schema_file_path = os.path.join(path_to_data_folder, "schema", os.path.basename(json_file_path)) 
    resolver = RefResolver('file://' + schema_file_path, None) 
    with open(schema_file_path) as schema_data: 
     try: 
      Draft4Validator(json.load(schema_data), resolver=resolver).validate(json_data) 
     except ValidationError as e: 
      print('ValidationError: Failed to validate {}: {}'.format(os.path.basename(json_file_path), str(e))) 
      exit() 

내가 테스트 할 사항은 다음과 같습니다

  1. 가 인스턴스화 Draft4Validator 클래스이며, validate 메소드가 json_data 호출됩니다?
  2. ValidationError이 던져졌으며 종료가 호출됩니까?

여기에 테스트 사례를 작성하려는 시도가 있습니다. 나는 open 방법 & Draft4Validator 클래스를 패치하기로 결정했다.

@patch('builtins.open', mock_open(read_data={})) 
@patch('myproject.common.helper.jsonschema', Draft4Validator()) 
def test_validate_json_specifications(mock_file_open, draft_4_validator_mock): 
    validate_json_specifications('foo_path_to_data', 'foo_json_file_path', {}) 
    mock_file_open.assert_called_with('foo_path_to_data/schema/foo_json_file_path') 
    draft_4_validator_mock.assert_called() 

실제 데이터를 전달하는 대신 가짜 데이터와 경로를 내 메서드에 전달하려고합니다.

@patch('myproject.common.helper.jsonschema', Draft4Validator()) 
E TypeError: __init__() missing 1 required positional argument: 'schema' 

가 어떻게이 방법 특별히 Draft4Validator 및 방법에 대한 패치를 만들어 가야합니까 내가 ValidationError 예외를 시뮬레이션 할 : 나는

는 UPDATE이 오류 메시지

있어?

답변

2

Draft4Validator을 잘못 패치했습니다. 기본적으로 당신이하고있는 것은 필수 인수없이 새로운 Draft4Validator 객체를 생성하고 매번 myproject.common.helper.jsonschema 호출에 할당하는 것입니다 (필요한 인수로 생성 했음).

여기에 대해 자세히 알아보기 : 예상 예외에 대한 주장을 확인을 위해 https://docs.python.org/3/library/unittest.mock-examples.html#patch-decorators

확인 :

@patch('sys.exit') 
@patch('myproject.common.helper.jsonschema.Draft4Validator') 
@patch('builtins.open') 
def test_validate_json_specifications(mock_file_open, draft_4_validator_mock, exit_mock): 
    with pytest.raises(ValidationError): 
     mock_file_open.return_value = {} 
     draft_4_validator_mock = Mock() 
     draft_4_validator_mock.side_effect = ValidationError 

     validate_json_specifications('foo_path_to_data', 'foo_json_file_path', {}) 

     assert draft_4_validator_mock.call_count == 1 
     assert draft_4_validator_mock.validate.assert_called_with({})   
     assert exit_mock.call_count == 1 
:이의 라인을 따라 뭔가를 원하는 내가 당신의 질문과 요구 사항에 맞춰 http://doc.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions