我正在运行一个sinatra应用程序,并使用rspec 2.7.0
和webrat 0.7.3
(都是最新版本)进行测试套件设置。我有一个广泛的测试集为我所有的请求行动,它似乎工作得很好。今天,我发现了Sinatra的重定向回请求级助手,并在我的应用程序的几个区域实现了它,这些区域正在呈现带有参数get请求的表单。
redirect back
助手的好处是,如果我有一个动作说:
get '/login' do
@used_var = params[:var]
haml :login
end
呈现表单,我可以对接收表单的post请求进行验证:
post '/login' do
# pretend User.authenticate pulls back a user entry from the database if there
# is a valid username/password combination
unless User.authenticate(params[:username], params[:password]).nil?
redirect '/content'
else
flash[:notice] = "Invalid username/password combo"
redirect back # will redirect back to the get '/login' request
end
end
如果表单没有正确验证,它将重定向回带有from的页面,并保留传入的任何参数,而不必担心将其存储到会话变量中。唯一的问题是,rspec似乎不想很好地与redirect back
帮助器配合。例如,如果我有一个这样的规范操作:
it 'should redirect to login when invalid username/password combo is received.' do
get '/login', :var => 'value'
fill_in 'username', :with => 'invalid_username'
fill_in 'password', :with => 'invalid_password'
click_button 'Submit'
last_response.should be_redirect; follow_redirect!
last_request.url.should include("/login")
end
规范未能通过,因为由于某种原因,rspec
或webrat
似乎没有在redirect back
helper上拾取,而是将请求重定向到我的应用程序('/'
)的root
url。
我想知道的是是否有办法让rspec重定向到正确的位置在这些情况下?当我用浏览器测试它时,实际应用程序的功能与预期一样(它将我重定向到带参数的第一页),但是rspec测试不能正常通过。
尝试将:referer => '/login'
传递给您的请求,因此redirect_back
可以知道实际'back'在哪里
显然这是一个bug在rack中,它似乎已经修复与rack 1.3.0
的发布。我用rack 1.2.5
(1.3.0
发布之前的最新版本)测试了这个规范,它失败了,但升级到1.3
后,它开始通过。
经过一番挖掘,非常确定这个拉请求(这里是提交)是修复它的更改。
所以这在rack ~> 1.3
中不再是一个问题。