FactoryGirl - Validação falhou: o fuso horário não está incluído na lista
Estou usando o Rspec, FactoryGirl e Capivara. Ao usar o ActiveSupport :: TimeZone.us_zones. Eu corro meu teste para o meurequests/users_spec
e nem sequer chegou ao teste, pois tem um problema na fábrica. Aqui está o erro:
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 é minha configuração:
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 '[email protected]'
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
Quando eu executo o teste para o meu modelo de usuário em geral, ele passa em todos os testes. Por que não reconhece como um fuso horário quando realmente é?
RESPONDA
No meu modelo User.rb eu tive que fazer:
validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:name)
Minha fábrica:
factory :user do
username 'user1'
email '[email protected]'
time_zone 'Eastern Time (US & Canada)'
password 'testing'
end
Minhas visões:
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:prompt => "Select Your Time Zone *"} %>
E se você tiver um pedido de teste da Capivara:
page.select('(GMT-10:00) Hawaii', :from => 'Time Zone')
Boa sorte.