Rspec 使用csrf保护测试sinatra路由

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

我正在尝试测试基本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
  # ... 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']}
对我有效