如何在Capybara中设置会话值?

Ner*_*ian 28 ruby-on-rails shopify capybara

我正在为Shopify开发一个应用程序,我想进行集成测试.

我需要能够在会话变量中存储一些值,以便身份验证起作用.

我怎么能这样做?

我使用Capybara和Capybara-webkit.

ron*_*nen 27

接受的答案表明rack_session_access.它的工作原理是插入中间件控制器来编辑和更新会话状态,然后让capybara访问该页面并提交一个包含会话数据的表单.非常巧妙!但如果您使用Warden(直接或通过Devise),则不必要.

Warden有一个钩子on_next_request,可以访问warden机制,可以直接设置会话密钥.我把它扔在一起把它捆绑在rspec中:

创建spec/support/inject_session.rb:

module InjectSession
  include Warden::Test::Helpers

  def inject_session(hash)
    Warden.on_next_request do |proxy|
      hash.each do |key, value|
        proxy.raw_session[key] = value
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

spec/spec_helper.rb功能规格中包含模块:

RSpec.configure do |config|
    config.include InjectSession, :type => :feature
end
Run Code Online (Sandbox Code Playgroud)

然后在规范中使用样本可能是:

   inject_session :magic => 'pixie dust', :color => 'pink' 
   visit shopping_cart_path
   page.should be_all_sparkly_and_pink # or whatever
Run Code Online (Sandbox Code Playgroud)


fgu*_*len 22

刚刚找到rack_session_access宝石并作为魅力工作.