我正在为Shopify开发一个应用程序,我想进行集成测试。
我需要能够在会话变量中存储一些值,以便进行身份验证。
我怎么能这样做?
我使用Capybara和Capybara-webkit。
答案 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资源的调用。