我正在为Shopify开发一个应用程序,希望进行集成测试。我需要能够存储一些值在会话变量中,以便进行身份验证。我应该如何做呢?我使用Capybara和Capybara-webkit。
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 继续进行,这很好用。 - Yossi Shashorails_helper.rb
中添加以下行来实现: Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require(f) }
- Gustavo G.刚发现 rack_session_access 宝石(gem),使用起来非常顺畅。
你可以使用像 VCR 或 webmock 这样的工具来模拟外部 HTTP 资源的调用。
正如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
我恐怕要带来不好的消息,根据Capybara的文档:
测试无法访问会话和请求,对响应的访问受到限制。
因此您将无法按照您的预期进行测试。
只是想到:在您的控制器中插入一些条件语句以进行测试是可以接受的。
session[:foo] = User.first.id if Rails.env.test?