Rspec 使用csrf保护测试sinatra路由
我正在尝试测试基本sinatra应用程序的路由,但由于csrf保护错误,我的测试请求失败Rspec 使用csrf保护测试sinatra路由,rspec,sinatra,rack,Rspec,Sinatra,Rack,我正在尝试测试基本sinatra应用程序的路由,但由于csrf保护错误,我的测试请求失败Rack::csrf::InvalidCsrfToken。 这些路由通常由客户端应用程序命中,该应用程序通过标记包含csrf令牌。 我曾尝试通过Rack::csrf.token访问csrf令牌,但我无法访问env(或者至少我不知道如何在我的rpsec测试中访问env),并且没有获得成功 app.rb use Rack::Csrf, raise: true put '/api/events/:id' do
Rack::csrf::InvalidCsrfToken
。
这些路由通常由客户端应用程序命中,该应用程序通过
标记包含csrf令牌。
我曾尝试通过Rack::csrf.token访问csrf令牌,但我无法访问env
(或者至少我不知道如何在我的rpsec测试中访问env
),并且没有获得成功
app.rb
use Rack::Csrf, raise: true
put '/api/events/:id' do
# ... code that updates an event ...
end
it "adds an event to the current user" do
user = Helpers.authorized_user
session = {user_id: user.id}
put '/events/1/join', {}, {'rack.session' => session, :xhr => true}
do
示例规范rb
use Rack::Csrf, raise: true
put '/api/events/:id' do
# ... code that updates an event ...
end
it "adds an event to the current user" do
user = Helpers.authorized_user
session = {user_id: user.id}
put '/events/1/join', {}, {'rack.session' => session, :xhr => true}
do
在测试这些路由时,如何绕过/安抚Rack:CSRF?创建并传递一个秘密HTTP头变量很简单
谢谢你的回答!我想我只能在我的应用程序中设置
skip\u,如果我在开发环境中,我更喜欢在测试框架中进行设置,而不是在我的应用程序代码本身。有什么想法吗?@NickTomlin在测试框架内这样做会产生技术债务,所以这可能不是最好的方式(IMHO)。我已经更新了我的答案,只跳过CSRF检查如果你在开发模式下运行,这可能不是你想要的,但希望能为你指出正确的方向我已经在测试环境中禁用了CSRF,而不是使用特殊的CSRF键,但想法基本上是一样的。谢谢<代码>使用Rack::Csrf,raise:true,跳过_如果:->(req){req.env['Rack.test']}
对我有效