#ruby-on-rails #ruby #rspec
#ruby-on-rails #ruby #rspec
Вопрос:
У меня есть метод, который делает это:
Учитывая массив тегов, он пытается извлечь тег по его имени из базы данных, если он существует, в противном случае он создает новый тег. Затем он возвращает коллекцию всех объектов тегов.
tag_text = "general tag1 tag2"
модель Tag.rb имеет свойство name, которое было бы в БД, если бы оно существовало.
Как мне следует приступить к тестированию метода:
def find_tags_from_tag_text (tag_text)
tags = []
tag_text.split.each do |x|
t = Tag.find_by_name(x)
if t.nil?
t = Tag.new(name => x).save!
end
tags << t
end
end
Комментарии:
1. Можете ли вы просто написать модульный тест, который вызывает этот метод с двумя тегами — один уже в БД, а другой нет — и обернуть его в блок assert_difference , чтобы убедиться, что создан ровно один новый тег? И в качестве отступления: find_or_create может сэкономить вам немного времени при вводе текста здесь. Приветствия!
Ответ №1:
Руководство по тестированию Railshttp://guides.rubyonrails.org/testing.html охватывает в значительной степени то, что вы пытаетесь сделать, вы проверили это? TL; DR: 1) подготовьте данные fixtures для инициализации пустой тестовой базы данных, 2) напишите тесты для сравнения фактических результатов с ожидаемыми результатами методов вашей модели.
Комментарии:
1. Я хотел провести модульный тест, а не интеграционный, поэтому подумал, что мне придется издеваться. разве это не самый чистый способ сделать это? отделите модульное тестирование от интеграционного тестирования.