Как я должен это протестировать, издеваться ли мне, поскольку он попадает в БД?

#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. Я хотел провести модульный тест, а не интеграционный, поэтому подумал, что мне придется издеваться. разве это не самый чистый способ сделать это? отделите модульное тестирование от интеграционного тестирования.