Насмешливый файл открывается и выдает исключение

Я новичок в тестировании Python. Я использую pytest и начал изучать макеты и патчи. Я пытаюсь написать тестовый пример для одного из моих методов.

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 и вызывается ли метод проверки с помощью 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?


person yesh    schedule 09.03.2017    source источник


Ответы (1)


Вы исправляли Draft4Validator неправильно. По сути, вы создавали новый объект Draft4Validator без необходимых аргументов и каждый раз назначали его вызову myproject.common.helper.jsonschema (если бы вы создали его с необходимыми аргументами).

Подробнее об этом читайте здесь: https://docs.python.org/3/library/unittest.mock-examples.html#patch-decorators

Для проверки утверждений об ожидаемых исключениях проверьте: http://doc.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions

Я предполагаю, что по вашему вопросу и требованиям вы хотите что-то вроде этого:

@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
person Enrique Saez    schedule 09.03.2017