Пользовательский сопоставитель маршрутизации RSpec для всех четырех глаголов HTTP?

Я пишу набор тестов RSpec для наших маршрутов для довольно большого приложения Rails 3. Многие маршруты используют «MATCH», но ни один из них не должен использоваться, тем более, что нам придется переписать их при переходе на Rails 4.

Большинство моих блоков it выглядят примерно так:

  it "with /comments/account/100" do
    expect(get("comments/account/100")).to    route_to("comments#list", :account_id => "100")
    expect(post("comments/account/100")).to   route_to("comments#list", :account_id => "100")
    expect(put("comments/account/100")).to    route_to("comments#list", :account_id => "100")
    expect(delete("comments/account/100")).to route_to("comments#list", :account_id => "100")
  end

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

expect(match_all_verbs("/comments/accounts/100")).to route_to("comments#list", :account_id => "100")

EDIT: окончательная рабочая версия, спасибо Стивену:

def match_all_verbs(path, method, options = {})
  [:get, :post, :put, :delete].each do |verb|
    expect(send(verb, path)).to route_to(method, options)
  end
end

Я добавил хэш options, чтобы передавать параметры маршрутам. Кажется, все работает нормально.

Ради интереса я сделал match_no_verbs, чтобы протестировать комбинацию .to_not be_routable:

def match_no_verbs(path, method, options = {})
  [:get, :post, :put, :delete].each do |verb|
    expect(send(verb, path)).to_not route_to(method, options)
  end
end

Спасибо большое!


person Kyle Carlson    schedule 11.09.2013    source источник


Ответы (1)


Пользовательские сопоставления RSpec принимают одно значение в соответствии с документацией, поэтому ваш формальный параметр values равен не определяется, и ваша ссылка на него в теле вашего сопоставления терпит неудачу.

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

Например, вы можете использовать (не проверено):

def match_all_verbs(path, method)
  [:get, :post, :put:, :delete].each do |verb|
    expect(send(verb, path)).to route_to(method)
  end
end
person Peter Alfvin    schedule 11.09.2013
comment
Благодаря тонну. Это (почти) именно то, что мне нужно. Гораздо проще, чем то, что я пытался. Смотрите мое редактирование вверху. - person Kyle Carlson; 12.09.2013