2011-12-07 136 views
0

我正在运行sinatra应用程序,并使用rspec 2.7.0webrat 0.7.3(均为最新版本)进行了测试套件设置。我对我的所有请求操作都有一套广泛的测试,并且它似乎工作正常。今天,我发现了Sinatra的redirect back请求级帮助程序,并在我的应用程序的几个区域中实现了它,这些区域呈现带有获取参数的请求的表单。测试Sinatra的重定向返回rspec

有关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和redirect重定向到页面,并保留传入的所有参数,而不必担心将它存储到会话变量中。唯一的问题是,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助手拿起,转而将请求重定向回我的应用程序的网址为root'/')。

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

回答

0

显然,这是一个错误的rack,它似乎已被固定的rack 1.3.0释放。我用rack 1.2.51.3.0版本之前的最新版本)测试了这个规范,并且它失败了,但升级到1.3后,它开始通过了。

经过一番挖掘后,很确定this pull request(这里是the commit)是修改它的变化。

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

1

试图通过:referer => '/login'您的要求,所以redirect_back可以知道实际“回”是

+0

对'post'动作的请求是由'get'动作中的一个表单完成的。您是否打算将当前请求路径放在名为'referer'的表单上的隐藏字段?同样,重定向返回操作对于浏览器来说工作正常,它只是对我的rspec测试无法正常工作。 – Batkins