(Отказ от ответственности: я не говорю на Python, поэтому я могу ошибаться в деталях)
Я предлагаю вам вместо этого высмеивать codecs
.Заставьте метод макета open
вернуть объект с тестовыми данными, которые будут возвращены из вызовов read
.Это может включать создание другого фиктивного объекта для возвращаемого значения;Я не знаю, есть ли в Python классы запаса, которые вы могли бы использовать для этой цели вместо этого.
Затем, чтобы действительно включить проверку логики, добавьте параметр к read_in_target_language
, который представляет объектэто может взять на себя роль исходного codecs
объекта, то есть внедрение зависимости аргументом.Для удобства, я думаю, вы могли бы по умолчанию установить значение codecs
.
Я не уверен, насколько далеко зашла типизация Python по утилитам в отношении методов static против экземпляра, но что-то вроде этого должно дать вам общее представление:
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>