如何在Capybara中设置会话值?

时间:2011-12-17 18:10:51

标签: ruby-on-rails capybara shopify

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

我需要能够在会话变量中存储一些值,以便进行身份验证。

我怎么能这样做?

我使用Capybara和Capybara-webkit。

5 个答案:

答案 0 :(得分: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

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

RSpec.configure do |config|
    config.include InjectSession, :type => :feature
end

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

   inject_session :magic => 'pixie dust', :color => 'pink' 
   visit shopping_cart_path
   page.should be_all_sparkly_and_pink # or whatever

答案 1 :(得分:22)

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

答案 2 :(得分:4)

正如apneadiving建议的评论,你应该使用水豚“直接”填写表格。使用Cucumber进行测试可能看起来像填写登录表单进行身份验证(来自Capybara github页面):

When /I sign in/ do
  within("#session") do
    fill_in 'Login', :with => 'user@example.com'
    fill_in 'Password', :with => 'password'
  end
  click_link 'Sign in'
  ...
end

如果您尝试做一些不同的事情或者在正常登录过程中遇到问题,this那么问题可能会有所帮助。

答案 3 :(得分:4)

我担心我会带来坏消息,但是来自Capybara的文档:

  

无法从测试,访问权限访问会话和请求   反应有限。

所以你将无法按预期进行测试。


只是想一想:在控制器中插入一些条件语句用于测试目的是可以接受的。:

 session[:foo] = User.first.id if Rails.env.test?

更好的选择是仅为您的集成测试修补控制器。

答案 4 :(得分:4)

您可以使用VCR或webmock之类的东西来存根对外部http资源的调用。