gpt4 book ai didi

python - 模拟文件打开并抛出异常

转载 作者:行者123 更新时间:2023-12-01 03:13:07 25 4
gpt4 key购买 nike

我是 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'

如何为 2 个方法(特别是 Draft4Validator)创建补丁以及如何模拟 ValidationError 异常?

最佳答案

您错误地修补了 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

关于python - 模拟文件打开并抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42704292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com