Вопрос по ruby-on-rails – Поддерживают ли спецификации маршрутизации маршруты перенаправления? [RSpec]

26

После глубокого изучения этого вопроса я зашел в тупик между моим пониманием документации и моими результатами.

В соответствии сhttps://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/routing-specs/route-to-matcherмы должны быть в состоянии написать следующее:

#rspec-rails (2.8.1)
#rspec (>= 1.3.1)
#rspec-core (~> 2.8.0)

# routing spec
require "spec_helper"

describe BusinessUsersController do
  describe "routing" do
    it "routes to some external url" do
      get("/business_users/7/external_url").should route_to("http://www.google.com")
    end
  end
end

# routes.rb
BizeebeeBilling::Application.routes.draw do

  resources :business_users do
    member do
      get "external_url" => redirect("http://www.google.com")
    end
  end
end

Запуск этой спецификации дает следующие результаты:     Неудачи:

  1) BusinessUsersController routing routes to some external url
     Failure/Error: assert_routing "/business_users/7/external_url", "http://www.google.com"
     ActionController::RoutingError:
       No route matches "/business_users/7/external_url"
     # ./spec/routing/business_users_routing_spec.rb:19:in `block (3 levels) in <top (required)>'

Я нигде не смог найти никого, кто бы сообщал об этой конкретной проблеме.

Добавлена подробная информация: маршрут разрешается на отлично при тестировании вручную.

Ваш Ответ

5   ответов
-3

a href = & quot; https: //www.relishapp.com/rspec/rspec-rails/v/2-8/docs/matchers/redirect-to-matcher" rel = "nofollow" & gt; redirect_to matcher.

Вы правы в этом. Тем не менее, они были созданы. Я полагаю, что это отдельная проблема в целом :( zealoushacker
Сопоставление redirect_to недоступно в спецификациях маршрутизации. Кроме того, ошибка не в сопоставителе, а в том, что маршрут, который четко определен в маршрутах. Rb не определяется при выполнении тестов. В качестве дополнительного пункта, сам маршрут отлично работает при тестировании вручную. zealoushacker
Если это не спецификация контроллера, то почему он начинается сdescribe BusinessUsersController?
-1

интеграционный тест:

  test "GET /my_page redirects Google" do
    get "/my_page"
    assert_redirected_to "https://google.com"
  end

Ваш тест должен быть под вашимtest/integration каталог или эквивалентный каталог, куда должны идти интеграционные тесты.

в rspec это будет спецификация запроса
41

соответствует ли маршрут конкретному контроллеру и действию (и, возможно, некоторым параметрам).

Я немного покопался во внутренностях Rails и Journey. RSpec и Rails (в основном, некоторые детали опущены) используютRails.application.routes.recognize_path чтобы ответить на вопрос «это маршрутизируемый?»

Например:

$ rails console
> Rails.application.routes.recognize_path("/business_users/1", method: "GET")
 => {:action=>"show", :controller=>"business_users", :id=>"1"}

Однако на другом конце контроллера нет/business_users/1/external_url, Фактически, чтобы выполнить перенаправление, Rails создал экземплярActionDispatch::Routing::Redirect, который представляет собой небольшое приложение Rack. Ни один контроллер Rails никогда не трогал. Вы в основном монтируете другое приложение Rack для выполнения перенаправления.

Чтобы проверить перенаправление, я рекомендую вместо этого использовать спецификацию запроса (файл вspec/requests). Что-то вроде:

require "spec_helper"

describe "external redirection" do
  it "redirects to google.com" do
    get "/business_users/1/external_url"
    response.should redirect_to("http://www.google.com")
  end
end

Это неявно проверяет маршрут и позволяет вам проверять перенаправление.

expect(response).to redirect_to("http://www.google.com") если вы не любите «должны»; синтаксис.
Это хорошо понять, но я столкнулся с проблемой при попытке этого. В моем Rspecbefore блок я загружаюseeds.rb поскольку есть некоторые базовые данные, необходимые даже при тестировании. Но так как перенаправление использует крошечное приложение Rack, загрузкаseeds.rb не удается с "не удалось найти таблицу" для любой из моих моделей, предположительно потому, что апплет не-Rails Rack не использует ActiveRecord. Поэтому у меня не осталось хорошего способа получить регрессии для моих маршрутов на основе перенаправления, которые работают в приложении, но я не могу пройти тест для них. :-(
23

ецификацию в спецификации / запросах, вы можете оставить ее в спецификации / маршрутизации и быть явным с метаданными «тип»:describe 'my route', type: :request do

Я попробовал это, но все еще не нашел объект ответа в контексте спецификации
Вопрос открытgithub.com/rspec/rspec-rails/issues/801
Немного покопавшись, похоже, что rspec не позволяет мне переопределять тип спецификаций в пути спецификации / маршрутизации. Если я перевожу его за пределы и помещаю под spec / request или spec / api, он просто работает. Я открою для этого проблему в rspec-rails.
Теперь это работает с использованием rspec-rails ~ & gt; 3.0.0.beta1
6

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

Я пытался с помощьюdescribe: 'my route', type: request, но обнаружил, что не работает. Тем не менее, вы можете включитьRSpec::Rails::RequestExampleGroup в контексте вашей спецификации, чтобы получить доступ к методам спецификации запроса. Что-то вроде:

describe "My Routes" do
  context "Don't Redirect" do
    it "gets URL that doesn't redirect" do
      get("business_users/internal_url").should route_to(controller: "business_users", action: "internal_url_action")
    end
  end

  context "Redirection" do
    include RSpec::Rails::RequestExampleGroup
    it "redirects to google.com" do
      get "/business_users/1/external_url"
      response.should redirect_to("http://www.google.com")
    end
  end
end

Похожие вопросы