33

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

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

我怎么能那样做?

我使用 Capybara 和 Capybara-webkit。

4

5 回答 5

32

接受的答案建议rack_session_access。它通过插入中间件控制器来编辑和更新会话状态,然后让水豚访问该页面并提交带有会话数据的表单。非常巧妙!但如果您使用 Warden(直接或通过设计),则没有必要。

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
于 2013-02-23T23:25:53.170 回答
27

刚刚找到rack_session_access gem 并作为一个魅力工作。

于 2012-11-08T15:42:28.283 回答
4

正如 apneadiving 的评论所建议的那样,您应该使用 capybara “直接”填写表格。使用 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

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

于 2011-12-17T19:42:17.463 回答
4

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

无法从测试中访问会话和请求,访问响应受到限制。

因此,您将无法按预期进行测试。


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

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

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

于 2011-12-18T11:36:47.830 回答
4

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

于 2012-04-08T13:50:05.223 回答