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

The*_*end 59 redirect rspec routes ruby-on-rails

所以我目前正在为现有控制器中的控制器编写一个测试,之前没有控制器.我想要测试的是重定向,当某人不被允许编辑某些内容与允许编辑它的人时发生.

正在编辑的控制器动作

def edit
  if !@scorecard.reviewed? || admin?
    @company = @scorecard.company
    @custom_css_include = "confirmation_page"
  else
    redirect_to :back
  end
end
Run Code Online (Sandbox Code Playgroud)

因此,如果记分卡已经过审核,那么只有管理员可以编辑该分数.该控制器的路由..

# scorecards
resources :scorecards do
  member do
    get 'report'
  end
  resources :inaccuracy_reports, :only => [:new, :create]
end
Run Code Online (Sandbox Code Playgroud)

最后是测试

  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
Run Code Online (Sandbox Code Playgroud)

因此,当尝试编辑已审核的分数时,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
Run Code Online (Sandbox Code Playgroud)

所以我不知道它的工作与否,因为我把它设置request.env["HTTP_REFERER"] = "/scorecard"为应该在:back哪里的地方.或者我错过了这个想法所有在一起看httpstatus有300个响应,我可以使用,但我不知道从哪里开始?

任何帮助都是极好的

编辑

我可以通过这样做来测试它

...
response.status.should be(302)
Run Code Online (Sandbox Code Playgroud)

但我从这个问题中得到了这个想法,听起来这可能是强大的,因为它指定了重定向的网址.

有没有像这样的工作测试?

Mug*_*ica 63

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

expect(response).to redirect_to(action_path)
Run Code Online (Sandbox Code Playgroud)


Bil*_*han 45

这条线有问题

response.should redirect_to :back
Run Code Online (Sandbox Code Playgroud)

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

要修改,只需将其设置为

response.should redirect_to '/scorecard'
Run Code Online (Sandbox Code Playgroud)

  • 最新的rspec语法:expect(response).to redirect_to'/ scorecard' (12认同)
  • 这就是我首先尝试的。`1) ScorecardsController GET 编辑作为 va_user 不允许您编辑已审阅的记分卡` `失败/错误:response.should redirect_to '/scorecard'` `预期响应将重定向到 &lt;http://test.host/ Scorecard&gt; 但重定向到 &lt;http://test.host/&gt;` (2认同)