ChatGPT解决这个技术问题 Extra ChatGPT

Rails/Rspec - 在控制器中测试重定向

所以我目前正在为一个以前没有的现有控制器中的控制器编写一个测试。我要测试的是当某人不允许编辑某些东西而不是允许编辑它的人时发生的重定向。

正在编辑的控制器动作

def edit
  if !@scorecard.reviewed? || 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。

有人有这样的工作测试吗?


M
Mugur 'Bud' Chirica

为了使测试更具可读性,您可以这样做:(rspec ~> 3.0)

expect(response).to redirect_to(action_path)

或者你可以只做动作名称,没有'_path'
@MateusLuiz你不能写任何例子吗?
@yivo 像这样:expect(response).to redirect_to :new_registration
B
Billy Chan

这条线有问题

response.should redirect_to :back

逻辑不正确。您应该期望 #edit 重定向到您之前设置的 :back 路径,即 /scorecard。但是您在此处设置了 :back。在 Rspec 的上下文中,:back 在每个示例中都应该为空。

要修改,只需将其设置为

response.should redirect_to '/scorecard'

这就是我首先尝试的。 1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard Failure/Error: response.should redirect_to '/scorecard' Expected response to be a redirect to <http://test.host/scorecard> but was a redirect to <http://test.host/>
我懂了。您是否尝试将 request.env["HTTP_REFERER"] = "/scorecard" 放入示例而不是之前。恐怕这个变量会丢失。
it "does not allow you to edit a reviewed scorecard" do request.env["HTTP_REFERER"] = "/scorecard" get 'edit', :id => @scorecard.id response.should redirect_to "/scorecard" end 然后 id 仍然得到相同的错误,这很难纠正。
这应该不难,我之前使用过类似的模式。请检查您在 /scorecard 中是否有过滤器。在您的get edit中,您就像没有登录的普通访问者一样,恐怕您也无法查看/scorecard页面,然后被进一步重定向到主页。
最新的 rspec 语法:expect(response).to redirect_to '/scorecard'
a
aldrien.h

用于测试是否发生了重定向,没有匹配的路由

(只是为了测试重定向,当路由太长时我使用了这个:D)。你可以简单地这样做:

expect(response.status).to eq(302) #redirected

J
Jason L.

就我而言,它没有返回 response。如果您最终遇到这种情况,您可以执行以下操作:

expect(page.current_path).to eql('expected/path')