我正在为 Shopify 开发一个应用程序,我想做集成测试。
我需要能够在会话变量中存储一些值,以便身份验证工作。
我怎么能那样做?
我使用 Capybara 和 Capybara-webkit。
我正在为 Shopify 开发一个应用程序,我想做集成测试。
我需要能够在会话变量中存储一些值,以便身份验证工作。
我怎么能那样做?
我使用 Capybara 和 Capybara-webkit。
接受的答案建议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
刚刚找到rack_session_access gem 并作为一个魅力工作。
正如 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 可能会有所帮助。
我担心我会带来坏消息,但来自 Capybara 的文档:
无法从测试中访问会话和请求,访问响应受到限制。
因此,您将无法按预期进行测试。
只是想:您可以在控制器中插入一些条件语句用于测试目的。:
session[:foo] = User.first.id if Rails.env.test?
更好的选择是只为您的集成测试修补您的控制器。
您可以使用 VCR 或 webmock 之类的东西来消除对外部 http 资源的调用。