在rspec中测试Sinatra的重定向

时间:2011-12-07 18:16:18

标签: ruby rspec sinatra rspec2 webrat

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

规范未能通过,因为出于某种原因,rspecwebrat似乎没有在redirect back帮助程序上取而代之,而是将请求重定向回{{ 1}}我的应用程序的网址(root)。

我想知道的是,是否有办法让rspec重定向到这些实例中的正确位置?当我使用浏览器测试它时,实际的应用程序按预期运行(它将我重定向到带参数的第一页),但是rspec测试没有正确传递。

2 个答案:

答案 0 :(得分:1)

尝试将:referer => '/login'传递给您的请求,因此redirect_back可以知道实际“返回”的位置

答案 1 :(得分:0)

显然这是rack中的一个错误,似乎已经通过rack 1.3.0的版本修复了。我使用rack 1.2.51.3.0发布之前的最新版本)测试了此规范,但失败了,但升级到1.3后,它开始传递。

经过一番挖掘后,非常确定this pull request(此处为the commit)是修正它的更改。

所以它不再是rack ~> 1.3中的问题。