Главный вопрос: Каков наиболее эффективный способ модульного тестирования, была ли переменная класса (self.file_path
) успешно переназначена методом, заданным нижеприведенным классом?
class FileHandler(object):
def __init__(self, file_path):
self.file_path = file_path # /original/path/file.csv
def reassign_path(new_path):
self.file_path = new_path # /new/path/file.csv
self.run_long_operation(self.file_path)
Сначала я попытался проверить, изменилась ли переменная self.file_path
после запуска reassign_path()
, но этот метод занимает очень много времени и значительно замедляет тестирование.
Дополнительные вопросы: Есть ли способ просто проверить, переназначает ли метод переменную класса без запуска всего метода? Есть ли лучший способ подойти к этому?
Вы могли издеваться над долгой операцией
@JETM - не могли бы вы подробнее рассказать, как я могу высмеять долгую операцию? Извините, я новичок в mocks и модульном тестировании.
Ответ @chepner говорит об этом лучше, чем я.
Я не утверждаю, что это решение Лучший, но оно удобное для тестирования. Это похоже на имитацию медленной операции, но более явную и тестирует функцию с использованием определенного интерфейса, а не делает предположения о том, что имитировать, зависящие от реализации.
Вместо того, чтобы жестко кодировать долгую и медленную операцию, сделайте ее аргументом для reassign_path
.
class FileHandler(object):
def __init__(self, file_path):
self.file_path = file_path
def reassign_path(self, new_path, f=FileHandler.run_long_operation):
self.file_path = new_path
f(self, self.file_path)
Теперь вы можете быстро протестировать reassign_path
, передав в качестве второго аргумента другую, более быструю функцию:
def test_reassign_path_quickly(self):
fh = FileHandler('/old/path')
fh.reassign_path('/new/path', lambda *args: None)
self.assertEquals(fh.file_path, '/new/path')
Теоретически вы можете проанализировать абстрактное синтаксическое дерево вашего кода, чтобы проверить это, используя встроенный модуль
ast
. Это не заставит ваш код работать.