Сложные запросы Arel и заглушка RSpec - PullRequest
2 голосов
/ 01 августа 2011

Допустим, у нас есть некоторый фрагмент кода, подобный следующему:

def index
  @posts = Post.where(:status => ACTIVE)
  if params[:s]
    @posts = Post.where("title like ?", "%#{params[:s]}%").order("title asc")
  else
    @posts = Post.limit(20).order("date desc")
  end
end

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

Какой лучший способ заглушки сложного запроса Arel для RSpec, если вы не знаете порядок или сколько методов будет вызвано?

ПРИМЕЧАНИЕ: я смотрел на Stubbing Chained Queries в Rails 3 и Rspec , и мне кажется, что я хочу что-то вроде stub_chain_with_indifferent_order(:where, :order, :limit).

1 Ответ

2 голосов
/ 15 августа 2011

Это может быть код, который говорит вам, что вы делаете это на неправильном уровне. Это то, что мне действительно нравится в философии RSpec MOCK ALL THE THE (!!) RSpec: если становится трудно издеваться, возможно, ваш дизайн неправильный.

Например, я могу изменить ваш код следующим образом:

def index
  @posts = Post.posts_for(:like => params[:s], :order => (params[:s] ? "title asc" : "date desc")
end

(или что-то немного лучше, учитывая ваш домен.)

Затем вы можете смоделировать Posts.posts_for, простой вызов метода, вместо того, чтобы пытаться смоделировать тонну цепочечных методов AR.

...