Где проходит грань в изолированности объекта тестирования?
Вопрос:
Где проходит грань в изолированности класса (объекта тестирования)? Как ты принимаешь решение что тестировать напрямую, а что стабами?
Ситуация: есть аудитория, которую можно импортировать из csv-файла. Чтобы проверить, что файл валиден, нужно убедиться, что в csv-файле есть колонки с почтой и именем клиента:
class AudienceList
def valid?
csv_headers.include?("Email") && csv_headers.include?("Name")
end
private
def csv_headers
@csv_headers ||= csv_data.first.keys
end
def csv_data
@csv_data ||= SmarterCSV.process(file)
end
end
AudienceList зависит от внешнего метода-запроса SmarterCSV#process. По умолчанию внешние зависимости я стаблю: это позволяет получить полностью изолированный, по-настоящему модульный, тест:
allow(SmarterCSV).to receive(:process)
.and_return(sample_csv_data)
# ...
expect(audience_list).to be_valid
Но если я чувствую себя неуверенно с получившимся тестом, если чувствую, что без стаба тест будет надежнее и полезнее, то тестирую напрямую. В данном случае я бы заготовил два csv-файла (валидный и невалидный) и положил бы их в spec/fixtures. Эти файлы послужили бы еще и отличным источником примеров, документации. Разработчики смогли бы заглянуть в них и подсмотреть реальные данные и их структуру.
P. S. Ещё больше постов о программировании, тестах и культуре разработки у меня в Телеграме.