我正在运行sinatra应用程序,并使用rspec 2.7.0
和webrat 0.7.3
(两个最新版本)设置测试套件。我对所有请求操作都进行了大量测试,似乎工作正常。今天我发现了Sinatra的redirect back请求级帮助程序,并在我的应用程序的几个区域中实现了它,这些区域使用获取请求的表单来呈现表单。
关于redirect back
助手的好处是,如果我有一个动作说:
get '/login' do
@used_var = params[:var]
haml :login
end
哪个呈现表单,我可以对收到表单的帖子请求进行验证:
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
帮助程序上取而代之,而是将请求重定向回{{ 1}}我的应用程序的网址(root
)。
我想知道的是,是否有办法让rspec重定向到这些实例中的正确位置?当我使用浏览器测试它时,实际的应用程序按预期运行(它将我重定向到带参数的第一页),但是rspec测试没有正确传递。
答案 0 :(得分:1)
尝试将:referer => '/login'
传递给您的请求,因此redirect_back
可以知道实际“返回”的位置
答案 1 :(得分:0)
显然这是rack中的一个错误,似乎已经通过rack 1.3.0
的版本修复了。我使用rack 1.2.5
(1.3.0
发布之前的最新版本)测试了此规范,但失败了,但升级到1.3
后,它开始传递。
经过一番挖掘后,非常确定this pull request(此处为the commit)是修正它的更改。
所以它不再是rack ~> 1.3
中的问题。