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.

questionAnswers(1)

yourAnswerToTheQuestion