Как проверить действия контроллера со сложными запросами? - PullRequest
0 голосов
/ 14 апреля 2011

Предположим, у меня есть следующее действие:

def index
  @posts = Post.joins(:tags).where(:tags => {:id => params[:tag_id]})
end

Предоставляет @posts представлению, которое будет отображать каждое сообщение с данным тегом.

Все работает нормально, но я застрял, пытаясь найти лучший способ проверить это.

Мне не очень нравится издеваться, так как это может затормозить тест, если я поменяю эту строку на:

@posts = Post.where(:tags => {:id => params[:tag_id]}).joins(:tags)

Я не хочу использовать базу данных, так как это уменьшит скорость тестирования, но я рассматриваю возможность извлечения запроса в метод внутри модели и его тестирования там, если это единственный способ сделать это. .

РЕДАКТИРОВАТЬ: Да, я знаю, что я мог бы использовать Tag.find(params[:tag_id]) в этом случае, но это не то, о чем вопрос. Я просто не хотел вводить в запрос другую модель и усложнять объяснение отклонения фокуса от реальной проблемы, а именно: должны ли мы хранить сложные запросы в контроллере? Если да, то как лучше всего это проверить?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2011

Итак, согласно комментариям, извлечение к модели - это лучшее, что нужно сделать.Вот как я это сделал:

post.rb:

class Post
  scope :tagged_as, lambda {|tag_id| where(:tag_id => tag_id)}
end

posts.yml:

one:
  title: Post 1
  tags: one, three

two:
  title: Post 2
  tags: two, three

post_test.rb:

test 'find by tag' do
  posts = Post.tagged_as(tags(:one))
  assert_includes posts, posts(:one)
  refute_includes posts, posts(:two)
end
0 голосов
/ 14 апреля 2011

Это то, что я люблю делать.Как правило, мне нравится интегрировать тестирование базы данных в мои тесты (хотя некоторые могут не согласиться, мне лично это нравится).Я бы создал 3 фабрики (: post) и, возможно, некоторые теги как фиктивные данные, а затем я бы вызвал контроллер и проверил, является ли полученный @posts тем, чего я ожидал.

...