在 rspec 中测试 Sinatra 的重定向



我正在运行一个sinatra应用程序,并使用rspec 2.7.0webrat 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

规范未能通过,因为由于某种原因,rspecwebrat似乎没有在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中不再是一个问题。

最新更新