2017-03-09 16 views
1

私はPythonテストには初めてです。私はpytestを使い、モックやパッチについて学び始めました。私は自分のメソッドの1つにテストケースを書きたいと思っています。私がテストしたいファイルのオープンとスロー例外の模倣

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がスローされ、exitが呼び出されますか?

ここまではテストケースを作成しようとしています。私は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() 

実際のデータを渡す代わりに、私のメソッドにいくつかの偽のデータとパスを渡したかったのです。どのように私は特別に2つの方法のためのパッチを作成する行くのですDraft4Validatorとどのように私はValidationError例外をシミュレートします

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

:私は、このエラーメッセージに

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

関連する問題