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

66

我目前正在为一个原本没有测试的控制器编写测试。我想要测试的是当某人无权编辑某物时发生的重定向和某人有权编辑时的情况。

这个控制器动作是编辑(edit)。

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

当试图编辑已审核的得分时,普通用户会被重定向回去,但管理员则不会。

但在运行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)

但是我从这个问题得到了这个想法,听起来可能很有用,因为它指定了重定向到的URL。

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

4个回答

86
为了使测试更易读,您可以这样做: (rspec ~> 3.0)
expect(response).to redirect_to(action_path)

1
或者你可以只使用动作名称,而不需要使用“_path”。 - Mateus Luiz
1
@MateusLuiz 你能否举个例子呢? - yivo
1
期望这样写:expect(response).to redirect_to :new_registration - Mateus Luiz

53

这行有问题

response.should redirect_to :back
逻辑不正确。您应该期望#edit重定向到您在之前设置的:back路径,即/scorecard。但是您在此处设置了:back。在 Rspec 的上下文中,:back 每个示例都应为空。
要进行修改,请将其设置为:
response.should redirect_to '/scorecard'

2
这是我最初尝试的。 1)ScorecardsController GET edit作为va_user不允许您编辑已审核的记分卡 失败/错误:响应应重定向到'/scorecard' 预期响应将重定向到<http://test.host/scorecard>,但实际上重定向到<http://test.host/> - legendary_rob
我明白了。你可以尝试将 request.env["HTTP_REFERER"] = "/scorecard" 放到示例中而不是之前。我担心这个变量会丢失。 - Billy Chan
“它“不允许您编辑已审核的记分卡”: request.env [“HTTP_REFERER”] =“/scorecard” get 'edit',:id => @scorecard.id response.should redirect_to“/scorecard”。” 然后我仍然会得到相同的错误,这真的很难弄对。” - legendary_rob
这应该不难,我之前使用过类似的模式。请检查一下/scorecard中是否有一些过滤器。在您的“获取编辑”中,您像一个没有登录的普通访问者一样,恐怕您也无权查看/scorecard页面,并进一步被重定向到主页。 - Billy Chan
14
最新的rspec语法:expect(response).to redirect_to '/scorecard' 期望(response)会重定向到'/scorecard'。 - Ryan Francis

4

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

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

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

0
在我的情况下,它没有返回一个 response。如果你遇到这种情况,你可以这样做:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接