Rails/Rspec - 在控制器中测试重定向
Posted
技术标签:
【中文标题】Rails/Rspec - 在控制器中测试重定向【英文标题】:Rails/Rspec - testing a redirect in the controller 【发布时间】:2013-05-02 17:15:36 【问题描述】:因此,我目前正在为以前没有的现有控制器中的控制器编写测试。我想测试的是一个重定向,当某人被允许编辑某些东西而不是被允许编辑它时发生。
正在编辑的控制器动作
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。
有人有这样的工作测试吗?
【问题讨论】:
【参考方案1】:为了使测试更具可读性,您可以这样做: (rspec ~> 3.0)
expect(response).to redirect_to(action_path)
【讨论】:
或者你可以只做动作名称,没有'_path' @MateusLuiz 你不能写任何例子吗? @yivo 像这样:expect(response).to redirect_to :new_registration【参考方案2】:这条线有问题
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'【参考方案3】:
用于测试是否发生了重定向,没有匹配的路由
(只是为了测试重定向,当路由太长时我使用了这个:D)。 你可以简单地这样做:
expect(response.status).to eq(302) #redirected
【讨论】:
以上是关于Rails/Rspec - 在控制器中测试重定向的主要内容,如果未能解决你的问题,请参考以下文章