Подтвердить что ты не робот

Rails/Rspec - тестирование перенаправления в контроллере

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

действие контроллера, редактируемое

def edit
  if [email protected]? || admin?
    @company = @scorecard.company
    @custom_css_include = "confirmation_page"
  else
    redirect_to :back
  end
end

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

# scorecards
resources :scorecards do
  member do
    get 'report'
  end
  resources :inaccuracy_reports, :only => [:new, :create]
end

и, наконец, тест

  require 'spec_helper'

  describe ScorecardsController do

    describe "GET edit" do
      before(:each) do
        @agency = Factory(:agency)
        @va = Factory(:va_user, :agency => @agency)
        @admin = Factory(:admin)
        @company = Factory(:company)
        @scorecard = Factory(:scorecard, :level => 1, :company => @company, :agency => @agency, :reviewed => true)
        request.env["HTTP_REFERER"] = "/scorecard"
      end

      context "as a admin" do
        before(:each) do
          controller.stub(:current_user).and_return @admin
        end

        it "allows you to edit a reviewed scorecard" do
          get 'edit', :id => @scorecard.id
          response.status.should be(200)
        end
      end

      context "as a va_user" do
        before(:each) do
        controller.stub(:current_user).and_return @va
      end

      it "does not allow you to edit a reviewed scorecard" do
        get 'edit', :id => @scorecard.id
        response.should redirect_to :back
      end
    end
  end
end

поэтому va при попытке отредактировать пересмотренный счет будет перенаправлен обратно, где не будет администратора.

но при запуске этого через rspec я получаю

ScorecardsController
  GET edit
    as a admin
      allows you to edit a reviewed scorecard
    as a va_user
      does not allow you to edit a reviewed scorecard (FAILED - 1)

Failures:

  1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard
     Failure/Error: response.should redirect_to :back
   Expected response to be a redirect to </scorecard> but was a redirect to <http://test.host/>
     # ./spec/controllers/scorecards_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

Finished in 0.48517 seconds
2 examples, 1 failure

поэтому я не знаю, работает ли это с тех пор, как я установил request.env["HTTP_REFERER"] = "/scorecard" как место, которое должно быть :back как оно где. или я пропустил идею, все вместе глядя на httpstatus есть 300 ответов, которые я мог бы использовать, но я не знал бы, с чего начать?

любая помощь была бы удивительной

ИЗМЕНИТЬ

Я мог бы протестировать его, сделав это так

...
response.status.should be(302)

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

у любого есть рабочий тест, подобный этому

4b9b3361

Ответ 1

В этой строке есть проблема

response.should redirect_to :back

Логика неверна. Вы должны ожидать, что #edit перенаправляется на путь :back, который вы задали раньше, а это /scorecard. Но вы установили :back здесь. В контексте Rspec :back должен быть пустым в каждом примере.

Чтобы пересмотреть, просто установите его как

response.should redirect_to '/scorecard'

Ответ 2

Чтобы сделать тест более читаемым, вы можете сделать следующее: (rspec ~ > 3,0)

expect(response).to redirect_to(action_path)