FactoryGirl - Error de validación: la zona horaria no está incluida en la lista
Estoy usando Rspec, FactoryGirl y Capybara. Cuando se usa ActiveSupport :: TimeZone.us_zones. Corro mi prueba para mirequests/users_spec
y ni siquiera llega a la prueba, ya que tiene un problema en la fábrica. Aquí está el error:
Failure/Error: make_user_and_login
ActiveRecord::RecordInvalid:
Validation failed: Time zone is not included in the list
# ./spec/support/user_macros.rb:3:in `make_user_and_login'
# ./spec/requests/users_spec.rb:7:in `block (3 levels) in <top (required)>'
Esta es mi configuración:
app / model / user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :email, :password, :remember_me, :username, :time_zone
validates_presence_of :username
validates_presence_of :time_zone
validates_format_of :username, :with => /^(?=(.*[a-zA-Z]){3})[a-zA-Z0-9]+$/
validates_uniqueness_of :email
validates_uniqueness_of :username, :case_sensitive => false
validates_length_of :username, :within => 3..26
validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones
end
spec / spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
config.include(MailerMacros)
config.include(UserMacros)
end
spec / factories.rb
FactoryGirl.define do
factory :user do
username 'user1'
time_zone '(GMT-05:00) Eastern Time (US & Canada)'
email 'user@example.com'
password 'testing'
end
end
spec / support / user_macros.rb
module UserMacros
def make_user_and_login
user = FactoryGirl.create(:user)
visit login_path
page.should have_selector('title', :text => 'Login')
fill_in('Email', :with => user.email)
fill_in('Password', :with => user.password)
click_button('Login')
page.should have_selector('title', :text => 'Home')
end
end
Cuando ejecuto la prueba para mi modelo de usuario en general, pasa toda la prueba. ¿Por qué no se reconoce como una zona horaria cuando realmente lo es?
RESPONDER
En mi modelo User.rb tuve que hacer:
validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:name)
Mi Fábrica:
factory :user do
username 'user1'
email 'user@example.com'
time_zone 'Eastern Time (US & Canada)'
password 'testing'
end
Mis opiniones:
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:prompt => "Select Your Time Zone *"} %>
Y si tienes una solicitud de prueba de Capybara:
page.select('(GMT-10:00) Hawaii', :from => 'Time Zone')
Buena suerte.