gpt4 book ai didi

python-3.x - 对使用上下文管理器的方法进行单元测试

转载 作者:行者123 更新时间:2023-11-28 20:49:36 26 4
gpt4 key购买 nike

我有一个方法要进行单元测试。该方法需要一个文件路径,然后打开 - 使用上下文管理器 - 解析一个值,如果它存在,则返回该值,非常简单。

@staticmethod
def read_in_target_language(file_path):
"""
.. note:: Language code attributes/values can occur
on either the first or the second line of bilingual.
"""
with codecs.open(file_path, 'r', encoding='utf-8') as source:
line_1, line_2 = next(source), next(source)
get_line_1 = re.search(
'(target-language=")(.+?)(")', line_1, re.IGNORECASE)
get_line_2 = re.search(
'(target-language=")(.+?)(")', line_2, re.IGNORECASE)
if get_line_1 is not None:
return get_line_1.group(2)
else:
return get_line_2.group(2)

我想避免针对外部文件进行测试 - 出于显而易见的原因 - 并且不希望创建临时文件。另外,在这种情况下我不能使用 StringIO。

如何在我的单元测试用例中模拟 file_path 对象?最终我需要创建一个包含不同值的模拟路径。非常感谢任何帮助。

最佳答案

(免责声明:我不会说 Python,所以我可能会在细节上出错)

我建议您改为模拟 codecs。使 mock 的 open 方法返回一个对象,其中包含要从 read 调用返回的测试数据。这可能涉及为返回值创建另一个模拟对象;我不知道 Python 中是否有一些常用类可以用于该目的。

然后,为了实际启用测试逻辑,向read_in_target_language 添加一个参数,表示一个对象可以承担原始codecs 对象的角色,即依赖通过参数注入(inject)。为了方便起见,我猜你可以将它默认为 codecs

我不确定 Python 的鸭子类型在静态方法和实例方法方面有多远,但像这样的东西应该给你一个大概的想法:

def read_in_target_language(file_path, opener=codecs):
...
with opener.open(file_path, 'r', encoding='utf-8') as source:

如果以上方法不可行,您可以添加一个间接层:

class CodecsOpener:
...
def open(self, file_path, access, encoding):
return codecs.open(file_path, access, encoding)

class MockOpener:
...
def __init__(self, open_result):
self.open_result = open_result

def open(self, file_path, access, encoding):
return self.open_result

...

def read_in_target_language(file_path, opener=CodecsOpener()):
...
with opener.open(file_path, 'r', encoding='utf-8') as source:
...

...

def test():
readable_data = ...
opener = MockOpener(readable_data)
result = <class>.read_in_target_language('whatever', opener)
<check result>

关于python-3.x - 对使用上下文管理器的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52611692/

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